Quanta memoria dovrebbero essere assegnati per i dati ricevuti da DIB HBITMAP utilizzando la funzione GetDIBits?
-
25-10-2019 - |
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).
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.