2009-03-19 7 views
4

CreateDIBSection()を使用してDIBを作成する場合は、BITMAPINFOHEADER構造体のbiHeightフィールドを負の値または正の値に設定することで、トップダウンまたはボトムアップにする必要があります。しかし、もし私が構造体を埋めるためにそのようなビットマップ上にGetObject()を呼び出すと、dsBm.bmHeightdsBmih.biHeightの両方が常に正のように見えます。DIBがボトムアップであるかトップダウンであるかは、どのようにして判断できますか?

私はDIBがトップダウンかボトムアップかを知る方法はありますか?HBITMAP

答えて

0

私はあなたがHBITMAPから得ることができるのはGetDIBitsになると思っています。しかし、GetDIBitsの問題はHDCが必要であり、HBITMAPはDDBでなければならないということです。

参照:GetDIBits Function

私は肯定的ではないんだけど、その可能性あなたは、変換に任意のトップdownnessを失うことになります。

1

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

1

GDIからその情報を取得する方法はありません。あなたが発見したように、BITMAPとBITMAPINFOHEADERのbmHeightフィールドは常にGetObjectで検索されています。 bmWidthBytesフィールドも同様に正の値をとります。 GDIハンドルを使用してDIBSectionに描画する(または描画する)場合、GDIはDIBSectionを正しい方法で描画します。抽出されたBITMAPINFOHEADERを使用すると、ビットマップのトップダウンが正しく行われません。

usermodeから伝える唯一の方法は、GDIを使ってビットマップの左上と左下のピクセルを2つの異なる値にテストし、バッファを読み込んで最初のメモリに書き込まれたことを確認することですロケーション。

本当に最適なのは、あなたのAPIに組み込むことです - あなたがDIITectionをHBITMAPとして渡しても、少なくともブールfIsDibSectionTopDownが渡されているか確実に保存されていることを確認してください。

関連する問題