- ベストアンサー
StretchDIBits
StretchDIBits()のxSrc, について質問なんですが この座標は, 画面の左下,左はしを(0,0) を基準としているんですか? 普通の関数の座標基準点とは上下逆になっているんですか? int StretchDIBits( HDC hdc, int XDest , int YDest , int nDestWidth , int nDestHeight , int XSrc , int YSrc , int nSrcWidth , int nSrcHeight , CONST VOID *lpBits, CONST BITMAPINFO *lpBitsInfo, UINT iUsage , DWORD dwRop );
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
参考URLの先のページの『解説』に、 > ボトムアップの DIB の原点は、ビットマップの左下隅です。トップダウンの DIB の原点は、ビットマップの左上隅です。 とあるように、対象とするDIBによって変わります。 lpBitsInfoで示される、DIBの高さが正の数のときボトムアップであり、こちらが一般的です。 lpBitsInfoで示される、DIBの高さが負の数のときトップダウンとなります。 ちなみに、YDestは、hdcに選択されているビットマップがボトムアップかトップダウンかにかかわらず、左上隅が原点になります。
その他の回答 (2)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★アドバイス >StretchDIBits()のxSrc, について質問なんですが >この座標は, 画面の左下,左はしを(0,0) >を基準としているんですか? ↑ いいえ、左上が (0,0) の座標になります。 よって >普通の関数の座標基準点とは上下逆になっているんですか? ↑ 他の関数と同じです。 ただし、マイナスの値を引数に渡せます。 この動作によってビットマップ画像の左右逆転、上下逆転したイメージを簡単に 描画できます。 ・マイナスに出来る値は確か nSrcWidth、nSrcHeight、nDestWidth、nDestHeight の引数です。 nSrcWidth=32、nSrcHeight=32 で nDestWidth=+32、nDestHeight=+32 …普通(反転なし) nDestWidth=-32、nDestHeight=+32 …左右反転 nDestWidth=+32、nDestHeight=-32 …上下反転 nDestWidth=-32、nDestHeight=-32 …上下左右反転(180°逆転) となります。 ・MSDN マニュアルにちゃんと >符号が異なる場合、x 軸を中心にしてビットマップのミラーイメージを作成します。 と書かれています。よって座標の左下が (0,0) ではなくて引数の符号により描画方向が 変化するためちょっと混乱したようですね。 ・下の『参考URL』をどうぞ。 以上。
お礼
回答ありがとうございます。 >左上が (0,0) の座標になります。 >他の関数と同じです。 がちょっと解らなかったですが >ボトムアップの DIB の原点は、ビットマップの左下隅です。 どうやら勘違いで ビットマップ左下隅を 画面左下隅と思い込んでたようです ビットマップ反転も教えていただきありがとうございます。 そこはあきらめていましたので。
- PED02744
- ベストアンサー率40% (157/390)
「普通の」というのがよくわかりませんが、DIB系はプロッタイメージを起源にしているので、 関数グラフのX-Y共にプラスのエリアを示します。 したがって、原点は左下になります。 どうしても「普通の」左上原点にしたければ、BITMAPINFOの設定で高さをマイナスにすればできますよ。
お礼
すばやい回答どうもです。 >「普通の」左上原点にしたければ、BITMAPINFOの設定で高さをマイナスにすればできますよ。 ありがとうございます。
お礼
回答どうもありがとうございます! ボトムアップ トップダウンによって原点がかわるということですね。 なるほど、ややこしくなってたので参考になりました。 ありがとうございます