imagenes - cuando usar mapa de bits
Cómo dibujar el mapa de bits ARGB usando GDI+? (4)
Tengo un identificador HBITMAP válido del tipo ARGB. ¿Cómo dibujar usando GDI +?
Probé el método: graphics.DrawImage (Bitmap :: FromHBITMAP (m_hBitmap, NULL), 0, 0); Pero no usa el canal alfa.
.NET ofrece el método estático Image.FromHbitmap
. A continuación, puede usar esta imagen e invocar DrawImage
en el objeto Graphics
destino.
Ah ... pero .Net no usa HBITMAP y GDI + es una biblioteca de C ++ encima del GDI básico de Windows, así que supongo que estás usando C ++ no-NET.
GDI + tiene una clase Bitmap, que tiene un método FromHBITMAP ().
Una vez que tenga la instancia GDI + Bitmap, puede usarla con la biblioteca GDI +.
Por supuesto, si puede escribir su programa en C # usando .Net, será mucho más fácil.
Tengo una muestra de trabajo:
// 1. Obtener información usando el manejador de mapa de bits: tamaño de imagen, bits
BITMAP bmpInfo;
::GetObject(m_hBitmap, sizeof(BITMAP), &bmpInfo);
int cxBitmap = bmpInfo.bmWidth;
int cyBitmap = bmpInfo.bmHeight;
void* bits = bmpInfo.bmBits;
// 2. Crea y dibuja un nuevo mapa de bits GDI + utilizando bits con formato de píxeles PixelFormat32bppARGB
Gdiplus::Graphics graphics(dcMemory);
Gdiplus::Bitmap bitmap(cxBitmap, cyBitmap, cxBitmap*4, PixelFormat32bppARGB, (BYTE*)bits);
graphics.DrawImage(&bitmap, 0, 0);
Tuve problemas similares para que mi canal transparente funcionara. En mi caso, sabía cuál debería ser el color de fondo para el área transparente (era sólido). Usé el método Bitmap.GetHBITMAP (..) y lo pasé en el color de fondo para usarlo en el área transparente. Esta fue una solución mucho más fácil que otros intentos que estaba tratando de usar LockBits y volver a crear el mapa de bits con PixelFormat32bppARGB, así como la clonación. En mi caso, el mapa de bits ignoraba el canal alfa ya que se creó a partir de Bitmap.FromStream.
También tuve algunos problemas muy extraños con el área de fondo de mi imagen que se modifica ligeramente. Por ejemplo, en lugar de blanco puro, era blanco como 0xfff7f7. Este era el caso si estaba usando JPG (con colores mezclados) o con PNG y colores transparentes.
Ver mi pregunta y solución en