Wie viel Speicher sollte für die von hbitmap empfangenen DIB -Daten mithilfe von GetDibits -Funktion zugewiesen werden?

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

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).

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top