¿Es posible BitBlt directamente de un mapa de bits GDI +?
Pregunta
¿Es posible utilizar BitBlt para copiar directamente de un mapa de bits GDI + sin utilizar GetHBitmap?
GetHBitmap es lento, ya que hace una nueva copia de toda la imagen, además de y más lento que la copia BitBlt, y la HBITMAP dado debe desecharse. La imagen es grande.
¿Hay una manera de señalar BitBlt para utilizar los datos de píxeles de la imagen original + GDI?
EDIT: que puedo obtener un puntero a donde los datos de mapa de bits de GDI + de píxeles está en la memoria. ¿Puedo crear un HBITMAP que apunta a los datos de mapa de bits GDI + de píxeles para evitar la copia extra, y BitBlt de eso?
Solución
Después de buscar durante días, de repente me di cuenta de que la respuesta me había estado mirando a la cara todo el tiempo! Estaba creando un mapa de bits de GDI + de un puntero a una matriz de bytes. A continuación, tratar de crear un HBITMAP utilizando el mismo puntero. Pero tan sólo pudiera crear fácilmente la primera HBITMAP y utilizar el puntero de que para crear el mapa de bits de GDI +.
Funciona como un encanto! Se pueden mezclar las operaciones de GDI y GDI + como usted quiera. La imagen es a la vez sencillo GDI y GDI + a la vez. En lugar de utilizar DrawImage, puede BitBlt partir de los datos exactos mismo píxel!
Aquí está el código:
// Create the HBITMAP
BITMAPINFO binfo = new BITMAPINFO();
binfo.biSize = (uint)Marshal.SizeOf(typeof(BITMAPINFO));
binfo.biWidth = width;
binfo.biHeight = height;
binfo.biBitCount = (ushort)Image.GetPixelFormatSize(pixelFormat);
binfo.biPlanes = 1;
binfo.biCompression = 0;
hDC = CreateCompatibleDC(IntPtr.Zero);
IntPtr pointer;
hBitmap = CreateDIBSection(hDC, ref binfo, 0, out pointer, IntPtr.Zero, 0);
// Create the GDI+ bitmap using the pointer returned from CreateDIBSection
gdiBitmap = new Bitmap(width, height, width * binfo.biBitCount >> 3, pixelFormat, pointer);