2

GetDIBits 関数を使用して HBITMAP から受信した DIB データにどのくらいのメモリを割り当てる必要がありますか?

GetDIBits 関数は、MSDN で次のように説明されています。

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

ただし、データ lpvBits を受信するためのバッファーは、GetDIBits を呼び出す前に割り当てる必要があります。これは、GetDIBits がこれを自動的に割り当てないためです。

問題は、DIB データを受信するためにどのくらいのメモリを割り当てる必要があるかということです。HBITMAP の width&height が Bmp_Width&Bmp_Height であるとします。ビットマップは 32 ビット (RGBA) です。

4

2 に答える 2

1

最も簡単な方法は、GetObject()関数を呼び出すことだと思います(そしてところで、画像ビットを取得するために):

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

次に、ビットマップフィールドを使用するだけです。

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

画像バイトを処理するアライメントwhemに注意してください!

これがお役に立てば幸いです。

于 2011-09-05T07:23:32.697 に答える
1

lpvBitsが指すメモリは、1スキャンラインのサイズに高さを掛けたものでなければなりません。各スキャンラインは、DWORD境界に位置合わせする必要があります。

32ビットカラーを使用しているため、最初のスキャンライン、つまりメモリブロックの開始が4バイトに整列していることを確認する限り、各スキ​​ャンラインは当然その要件を満たします。

したがって、バイト単位で測定される答えは4 * width * heightであり、4バイト境界で開始するように調整されます。

于 2011-09-05T07:27:38.813 に答える