Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Gráficos (https://www.clubdelphi.com/foros/forumdisplay.php?f=8)
-   -   Hacer CopyRect sin TransparentColor (https://www.clubdelphi.com/foros/showthread.php?t=72871)

Kandorf 16-03-2011 15:13:02

Hacer CopyRect sin TransparentColor
 
Hola, estoy haciendo una aplicación en la que tengo dos imágenes con transparencia en las que pinto. Una está sobre la otra, de tal manera que superpongo una imagen delante de otra para formar un dibujo completo (por ejemplo en la imagen de fondo dibujo unas montañas y en la que está delante unos árboles), la intención es crear escenarios del tipo de los juegos antiguos, basados en Tiles.

El problema me surge cuando quiero guardar las dos imágenes en una sola, hasta ahora he estado usando la función CopyRect para pintar en la imagen felizmente, pero ya no puedo hacerlo de la misma manera, ya que la imagen superior sobreescribe totalmente a la inferior, lo que me gustaría es que las partes de la imagen superior con color igual a TransparentColor no se dibujaran, quedando la imagen inferior visible.

Creo que será más aclarativo si enseño el código:
Código Delphi [-]
// Proceso de guardado
procedure TFrmPrincipal.Button1Click(Sender: TObject);
var
  FotoPNG : TPngImage; // La quiero guardar en formato PNG
  FotoBMP  : TBitmap; // Mapa de bits temporal en el que formo la imagen que voy a guardar
  Tamaño: TRect; // Proporciones de la imagen que voy a guardar
begin
  FotoBMP := TBitmap.Create;
  FotoBMP.TransparentColor:=ImgTitleset.Picture.Bitmap.TransparentColor;
  try
    // Le doy el tamaño a la imagen temporal
    FotoBMP.Width:=ImgCapa1.Width;
    FotoBMP.Height:=ImgCapa1.Height;

    // Le doy los valores al objeto de tipo TRect
    Tamaño.Left := 0;
    Tamaño.Top := 0;
    Tamaño.Right := FotoBMP.Width;
    Tamaño.Bottom := FotoBMP.Height;

    //FotoBMP.Canvas.CopyMode:=cmSrcAnd; // Los CopyMode son intentos fallidos
    FotoBMP.Canvas.CopyRect(Tamaño,ImgCapa1.Picture.Bitmap.Canvas,Tamaño);
    //FotoBMP.Canvas.CopyMode:=cmSrcPaint;
    //FotoBMP.Canvas.CopyMode:=cmPatPaint;
    // Al hacer el siguiente paso copio la segunda imagen tal cual, sobreescribiendo el color "transparente" las zonas de la imagen de fondo
    FotoBMP.Canvas.CopyRect(Tamaño,ImgCapa2.Picture.Bitmap.Canvas,Tamaño);

    // Lo paso a PNG
    FotoPNG:=TPngImage.Create;
    FotoPNG.Assign(FotoBMP);
    FotoPNG.SaveToFile('C:\Users\Kandorf\Desktop\prueba.png');
    FotoPNG.Free;
  finally
    FotoBMP.Free;
  end;
end;
Buscando he encontrado que se podría hacer creando una máscara en blanco y negro y utilizando CopyMode:=cmSrcAnd, pero no tengo ni idea de cómo crear esa máscara.

Si queréis que muestre una imagen del programa para entenderlo mejor decídmelo.

Saludos y gracias por vuestro tiempo.


La franja horaria es GMT +2. Ahora son las 19:12:14.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi