Ver Mensaje Individual
  #1  
Antiguo 16-03-2011
Kandorf Kandorf is offline
Miembro
 
Registrado: may 2007
Posts: 38
Reputación: 0
Kandorf Va por buen camino
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.
Responder Con Cita