Quanta memoria dovrebbero essere assegnati per i dati ricevuti da DIB HBITMAP utilizzando la funzione GetDIBits?

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

Domanda

Quanta memoria dovrebbe essere allocata per i dati ricevuti da DIB HBITMAP utilizzando funzione GetDIBits?

La funzione GetDIBits è descritto in MSDN come segue:

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

Tuttavia, il buffer per ricevere i dati lpvBits devono essere assegnate prima di chiamare GetDIBits, perché GetDIBits non allocare automaticamente.

La domanda è la quantità di memoria dovrebbe essere assegnato per ricevere i dati DIB? Supposto che il HBITMAP ha larghezza e altezza Bmp_Width & Bmp_Height; e la bitmap è a 32 bit (RGBA).

È stato utile?

Soluzione

Penso che il modo più semplice sta chiamando la funzione GetObject () (E BTW per ottenere i bit di immagine):

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

Poi è sufficiente utilizzare il bitmap campi:

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

Essere consapevoli di allineamento whem elaborazione byte immagine!

Spero che questo sarà utile!

Altri suggerimenti

La memoria a cui punta lpvBits devono essere le dimensioni di una linea di scansione volte l'altezza. Ogni linea di scansione deve essere allineato su un confine DWORD.

Poiché si utilizza 32 bit di colore allora ogni linea di scansione naturalmente satisy tale requisito, finché si accerta che il primo linea di scansione, cioè l'inizio del blocco di memoria, è 4 byte allineato.

Quindi la risposta, misurata in byte, è 4 * width * altezza, allineati per iniziare su un limite di 4 byte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top