2 Stimmen

Wie viel Speicher sollte für die von HBITMAP mit der Funktion GetDIBits empfangenen DIB-Daten zugewiesen werden?

Wie viel Speicher sollte für die von HBITMAP mit der Funktion GetDIBits empfangenen DIB-Daten zugewiesen werden?

Die Funktion GetDIBits wird im 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 für den Empfang der Daten lpvBits muss jedoch vor dem Aufruf von GetDIBits zugewiesen werden, da GetDIBits diesen nicht automatisch zuweist.

Die Frage ist, wie viel Speicherplatz sollte für den Empfang der DIB-Daten zugewiesen werden? Angenommen, die HBITMAP hat Breite und Höhe als Bmp_Width&Bmp_Height; und die Bitmap ist 32-bit (RGBA).

1voto

beren Punkte 166

Ich denke, der einfachste Weg ist der Aufruf der Funktion GetObject() (Und übrigens, um die Bildbits zu erhalten):

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

Dann verwenden Sie einfach die Bitmap-Felder:

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

Achten Sie bei der Verarbeitung von Bildbytes auf die Ausrichtung!

Ich hoffe, dies ist hilfreich!

1voto

David Heffernan Punkte 585606

Der Speicher, auf den lpvBits zeigt, muss die Größe einer Abtastzeile mal der Höhe haben. Jede Abtastzeile muss an einer DWORD-Grenze ausgerichtet sein.

Da Sie 32-Bit-Farben verwenden, erfüllt jede Scanline diese Anforderung, solange Sie sicherstellen, dass die erste Scanline, d. h. der Beginn des Speicherblocks, 4 Byte ausgerichtet ist.

Die Antwort, gemessen in Bytes, ist also 4*Breite*Höhe, ausgerichtet, um an einer 4-Byte-Grenze zu beginnen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X