4

を使用して DIB を作成する場合、構造体のフィールドを負または正の値にCreateDIBSection()設定することで、トップダウンまたはボトムアップのどちらにするかを指定できます。ただし、そのようなビットマップを呼び出して構造体を埋めると、との両方が常に正のように見えます。biHeightBITMAPINFOHEADERGetObject()DIBSECTIONdsBm.bmHeightdsBmih.biHeight

DIB しかない場合に、DIB がトップダウンかボトムアップかを調べる方法はありHBITMAPますか?

4

3 に答える 3

1

いいえ; そのためには BITMAPINFOHEADER が必要ですが、HBITMAP からは回復できません。

于 2009-03-19T17:46:22.823 に答える
1

その情報を GDI から取得する方法はありません。お気づきのように、GetObject を介して取得された BITMAP および BITMAPINFOHEADER bmHeight フィールドは常に正です。bmWidthBytes フィールドも同様に正です。GDI ハンドルを使用して DIBSection に (または DIBSection から) 描画すると、GDI は DIBSection を正しい方向に描画します。抽出された BITMAPINFOHEADER を使用すると、トップダウンのビットマップが間違って取得されます。

ユーザーモードから判断する唯一の方法は、GDI を使用してテストすることです。ビットマップの左上と左下のピクセルを 2 つの異なる値に設定し、バッファを読み取って、どの書き込みが最初のメモリ位置に到達したかを確認します。

本当に最良のオプションは、API に組み込むことです。DIBSection を HBITMAP として渡すときはいつでも、少なくとも bool fIsDibSectionTopDown が渡されるか保存されることを確認してください。

于 2009-05-21T14:30:37.403 に答える
0

HBITMAPから取得できる最高のものは、GetDIBitsになると思います。ただし、GetDIBitsの問題は、HDCも必要であり、HBITMAPがDDBである必要があることです。

参照:GetDIBits関数

私は前向きではありませんが、コンバージョンでトップダウンが失われる可能性があります。

于 2009-03-20T01:44:30.443 に答える