¿Cuánta memoria se debe asignar para los datos DIB recibidos de HBITMAP mediante la función GetDIBits?

¿Cuánta memoria se debe asignar para los datos DIB recibidos de HBITMAP mediante la función GetDIBits?

La función GetDIBits se describe en MSDN de la siguiente manera:

int GetDIBits( __in HDC hdc, __in HBITMAP hbmp, __in UINT uStartScan, __in UINT cScanLines, __out LPVOID lpvBits, __inout LPBITMAPINFO lpbi, __in UINT uUsage ); 

Sin embargo, el búfer para recibir lpvBits de datos debe asignarse antes de llamar a GetDIBits, porque GetDIBits no lo asigna automáticamente.

La pregunta es ¿cuánta memoria debe asignarse para recibir los datos DIB? Se supone que el HBITMAP tiene ancho y alto como Bmp_Width & Bmp_Height; y el bitmap es de 32 bits (RGBA).

Creo que la forma más sencilla es llamar a la función GetObject () (y por cierto para obtener los bits de imagen):

 BITMAP bmpObject; GetObject(hBitmap, sizeof(BITMAP), &bmpObject); 

Luego simplemente usa los campos de bitmap:

 LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight; 

Tenga en cuenta la alineación en el procesamiento de bytes de imagen!

¡Esperamos que esto sea útil!

La memoria apuntada por lpvBits debe ser del tamaño de una línea de escaneo por la altura. Cada línea de escaneo debe estar alineada en un límite DWORD.

Dado que está utilizando un color de 32 bits, cada línea de exploración cumplirá naturalmente con ese requisito, siempre que se asegure de que la primera línea de exploración, es decir, el inicio del bloque de memoria, esté alineada en 4 bytes.

Así que la respuesta, medida en bytes, es 4 * ancho * alto, alineada para comenzar en un límite de 4 bytes.