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

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

質問

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を呼び出す前に割り当てる必要があります。

問題は、DIBデータを受信するためにどのくらいのメモリを割り当てる必要があるかということです。 hbitmapの幅と高さはbmp_width&bmp_height;ビットマップは32ビット(RGBA)です。

役に立ちましたか?

解決

最も簡単な方法は、getobject()関数(および画像ビットを取得するために)を呼び出すことだと思います。

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

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

LONG size = bmpObject.bmWidthBytes * bmpObject.bmHeight;

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

これが役立つことを願っています!

他のヒント

LPVBITSが指すメモリは、高さの速度速度の1つのスキャンラインのサイズでなければなりません。各スキャンラインは、DWORD境界に合わせて調整する必要があります。

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

そのため、バイトで測定された答えは4*幅*高さで、4バイトの境界で開始するように整列しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top