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

c++ visual-c++ bitmap gdi dib

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


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

問題は、DIBデータを受信するためにどのくらいのメモリを割り当てる必要があるかです。 HBITMAPの幅と高さがBmp_Width&Bmp_Height;であるとします。ビットマップは32ビット(RGBA)です。
答え
最も簡単な方法は、GetObject()関数(および画像ビットを取得するBTW)を呼び出すことだと思います。

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


次に、ビットマップフィールドを使用します。

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;


画像バイトを処理する整列whemに注意してください!

これがお役に立てば幸いです!
関連記事

c++ - テンプレートに関するこの記事の理解に助けが必要

c++ - 循環呼び出しを検出する方法は?

c++ - セグメンテーション違反と実行時エラー[重複]

c++ - NVCCにx64オブジェクトを生成するように指示するにはどうすればよいですか?

c++ - LuaPlus Metatablesの初心者向け質問

c++ - 明示的な型変換の要件

c++ - ペアベクトルc++の上限

c++ - setjmpがスタックを保存しないのはなぜですか?

c++ - coutをキャプチャして関数にリダイレクトする

c++ - Eclipseを使用してMySQLをC++に接続しますか?