Tanto delphi como builder permiten cierto grado de transparencia en el manejo de TBitmap y TImage, pero no siempre satisface las necesidades que se nos puedan plantear.
Vamos a tratar de solucionar algunos problemas simples o no tan simples.
1.- Transparencia de un color usando sólo API, sin usar las bondades de la VCL
2.- Transparencia de un color usando AlphaBlend
3.- Semitransparencias.
4.- Semitransparencias degradadas y capas.
Vallamos pues al grano.
1.- Transparencia de un color usando sólo API.
En ocasiones podemos encontrarnos con que necesitamos usar API pura. Partiendo de un HDC donde pintar, un HBITMAP y un color, podemos crear la transparencia. Para ello creamos un bitmap máscara. El color de transparencia lo convertiremos al blanco y el resto al negro. El resto será usar la API BitBlt con los modificadores apropiados y como base SRCINVERT y SRCAND para eliminar el color que nos interesa:
procedure DrawTransparent(DC: HDC; Left, Top: integer; hImage: HBITMAP; TrColor: COLORREF); var hMask: HBITMAP ; dcImage, dcMask: HDC; Bitmap: TagBITMAP; begin // Crear la máscara: // Crer bitmap monocromo: mask GetObject(hImage, sizeof(TagBITMAP), @Bitmap); hMask := CreateBitmap(Bitmap.bmWidth, Bitmap.bmHeight, 1, 1, nil); dcImage := CreateCompatibleDC(0); dcMask := CreateCompatibleDC(0); SelectObject(dcImage, hImage); SelectObject(dcMask, hMask); // Creamos el MaskBitmap según el TrColor SetBkColor(dcImage, TrColor); BitBlt(dcMask, 0, 0, Bitmap.bmWidth, Bitmap.bmHeight, dcImage, 0, 0, SRCCOPY); // Dibujar transparente BitBlt(DC, Left, Top, Bitmap.bmWidth, Bitmap.bmHeight, dcImage, 0,0, SRCINVERT); BitBlt(DC, Left, Top, Bitmap.bmWidth, Bitmap.bmHeight, dcMask, 0,0, SRCAND); BitBlt(DC, Left, Top, Bitmap.bmWidth, Bitmap.bmHeight, dcImage, 0,0, SRCINVERT); // Liberar los HDC y la Mascara hMask DeleteDC(dcImage); DeleteDC(dcMask); DeleteObject(hMask); end;
Un ejemplo de uso partiendo de dos TImages con un TBitmap cada una:
var TrColor: COLORREF; begin // Para compatibilizar los Bitmap podemos pasarlo a 32 bits Image1.Picture.Bitmap.PixelFormat := pf32bit; // Tomamos un color que será el transparente TrColor:= Image2.Picture.Bitmap.Canvas.Pixels[0,0]; // Dibujamos DrawTransparent(Image1.Canvas.Handle, 0,0, Image2.Picture.Bitmap.Handle, TrColor); Invalidate; end;
Saludos.