getDibits関数を使用してHBITMAPから受信したDIBデータに対して、どのくらいのメモリを割り当てる必要がありますか?
-
25-10-2019 - |
質問
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バイトの境界で開始するように整列しています。
所属していません StackOverflow