Bajo Win32, es una técnica común para generar una máscara de bits en blanco y negro de un mapa de bits para su uso transparencia de la siguiente manera:Cómo genrate una máscara de bits en blanco y negro de un mapa de bits de 32 bits
SetBkColor(hdcSource, clrTransparency);
VERIFY(BitBlt(hdcMask, 0, 0, bm.bmWidth, bm.bmHeight, hdcSource, 0, 0, SRCCOPY));
Esto supone que hdcSource es una memoria DC que contiene la imagen fuente, y hdcMask es una memoria DC que contiene un mapa de bits monocromático del mismo tamaño (por lo tanto, ambos son 32x32, pero la fuente es de 4 bits de color, mientras que el objetivo es monocromo de 1 bit).
Sin embargo, esto parece fallarme cuando la fuente es 32 bit color + alpha. En lugar de obtener un mapa de bits monocromo en hdcMask, obtengo una máscara que es completamente negra. Ningún bit se establece en blanco (1). Mientras que esto funciona para la fuente de color de 4 bits.
Mi búsqueda está fallando, ya que no puedo encontrar ninguna referencia a este problema en particular.
He aislado que este es realmente el problema en mi código: es decir, si uso un mapa de bits de origen de 16 colores (4 bits), funciona; si utilizo una imagen de 32 bits, produce la máscara completamente negra.
¿Existe algún método alternativo que deba usarse en el caso de las imágenes en color de 32 bits? ¿Hay algún problema con el canal alfa que anule el comportamiento normal de la técnica anterior?
¡Gracias por cualquier ayuda que pueda tener que ofrecer!
ADDENDUM: Todavía no puedo encontrar una técnica que cree un mapa de bits monocromático válido para mi mapa de bits de origen producido por GDI +.
He aliviado un poco mi problema en particular simplemente no generando una máscara de bits monocromática en absoluto, y en su lugar estoy usando TransparentBlt(), que parece hacerlo bien (pero no sé lo que están haciendo internamente) eso es diferente que les permite enmascarar correctamente la imagen).
Podría ser útil tener una muy buena función, trabajando:
HBITMAP CreateTransparencyMask(HDC hdc, HBITMAP hSource, COLORREF crTransparency);
donde siempre crea una máscara de transparencia válida, independientemente de la profundidad de color de Hsource.
Ideas?
GDI está atascado en 24 bpp. TransparentBlt() es un poco inusual, está documentado para admitir 32bpp. Es hora de pasar a GDI + tal vez. –