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

StackOverflow https://stackoverflow.com/questions/7304749

Pregunta

¿Cuánta memoria se debe asignar para los datos DIB recibidos de HBITMAP utilizando 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 datos LPVBITS debe asignarse antes de llamar a GetDibits, porque GetDibits no asigna esto automáticamente.

La pregunta es ¿cuánta memoria se debe asignar para recibir los datos de DIB? Supuso que el HBITMAP tiene ancho y altura como bmp_width & bmp_height; y el mapa de bits es de 32 bits (RGBA).

¿Fue útil?

Solución

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

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

Entonces simplemente usa los campos de mapa de bits:

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

¡Tenga en cuenta los bytes de imagen de procesamiento de whem!

¡Esperamos que esto sea útil!

Otros consejos

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

Dado que está utilizando el color de 32 bits, cada línea de escaneo será naturalmente satisfecho de ese requisito, siempre que se asegure de que la primera línea de escaneo, es decir, el inicio del bloque de memoria, esté alineada de 4 bytes.

Entonces, la respuesta, medida en bytes, es de 4*ancho*de altura, alineada para comenzar en un límite de 4 bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top