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?

¿Fue útil?

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top