Wie viel Speicher sollte für die von hbitmap empfangenen DIB -Daten mithilfe von GetDibits -Funktion zugewiesen werden?
-
25-10-2019 - |
Frage
Wie viel Speicher sollte für die von hbitmap empfangenen DIB -Daten mithilfe von GetDibits -Funktion zugewiesen werden?
Die GetDibits -Funktion wird in MSDN wie folgt beschrieben:
int GetDIBits(
__in HDC hdc,
__in HBITMAP hbmp,
__in UINT uStartScan,
__in UINT cScanLines,
__out LPVOID lpvBits,
__inout LPBITMAPINFO lpbi,
__in UINT uUsage
);
Der Puffer zum Empfang von Daten LPVBits muss jedoch vor dem Aufrufen von GetDibits zugewiesen werden, da GETDIBits dies nicht automatisch zuordnet.
Die Frage ist, wie viel Speicher zugewiesen werden sollte, um die DIB -Daten zu erhalten? Vermutet, dass die Hbitmap als BMP_WIDTH & BMP_HEIGHT WEDTH & HEIGHT; und die Bitmap ist 32-Bit (RGBA).
Lösung
Ich denke, der einfachste Weg ist es, GetObject () -Funktion (und übrigens, um die Bildbits zu erhalten) aufzurufen:
BITMAP bmpObject;
GetObject(hBitmap, sizeof(BITMAP), &bmpObject);
Dann verwenden Sie einfach die Bitmap -Felder:
LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;
Achten Sie auf die Ausrichtung des WHE -Verarbeitung von Bild Bytes!
Hoffe das wird hilfreich!
Andere Tipps
Der von LPVBits gezeigte Speicher muss die Größe einer Scan -Linie haben, die die Höhe der Höhe haben. Jede Scan -Linie muss an einer DWORD -Grenze ausgerichtet sein.
Da Sie 32 -Bit -Farbe verwenden, wird jede Scanline diese Anforderung natürlich zufriedenstellen, solange Sie sicherstellen, dass der erste Scanline, dh der Beginn des Speicherblocks, 4 Byte ausgerichtet ist.
Die in Bytes gemessene Antwort beträgt also 4*Breite*Höhe und startet an einer 4 -Byte -Grenze.