
StretchBlt関数について
画像を縮小して表示しようとしていますが、上手くいきません。
beforeはint型の変数で現在「0」が入っていますので、
無視していただきたいと思います。
まず、テストでStretchBlt関数で縮小しない状態で画面縦幅の中央に表示しようと
下記コードで試みましたが、横は問題ないようですが、
縦に拡大1.5倍くらい拡大されてしまいました。
int MyBitOpen(HWND hWnd,HDC hNormalDC,DataParam *data){
HBITMAP hBitmap;
BITMAP bmpInfo={0};
HDC hBitDC;
RECT rc;
hBitDC=CreateCompatibleDC(NULL);
hBitmap=(HBITMAP)LoadImage(NULL,data->szFile[data->iFileCount],
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
GetObject(hBitmap,sizeof(BITMAP),&bmpInfo);
SelectObject(hBitDC,hBitmap);
GetClientRect(hWnd,&rc);
StretchBlt(hNormalDC,before+5,(rc.bottom-bmpInfo.bmHeight)/2,
(before+5)+bmpInfo.bmWidth,((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight,
hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
関数から戻り
BitBlt(hdc,0,0,rc.right,rc.bottom,hNormalDC,0,0,SRCCOPY);
で画面出力しております。
これがうまくいかない理由もわかりませんが、
下記のように(1)StretchBltを使用せずBitBltに書き換えただけのものと
(2)StretchBltを使用しても描画開始座標を(0、0)に変更したものは
拡大されず上手くいってしまいます。
(1)
BitBlt(hNormalDC,before+5,(rc.bottom-bmpInfo.bmHeight)/2,
(before+5)+bmpInfo.bmWidth,((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight,
hBitDC,0,0,SRCCOPY);
(2)
StretchBlt(hNormalDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,
hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
座標の取得は間違っていないと思うのですが・・
本来は画面中央に縦横1/2に縮小した下記のコードでしたが
まず上記がうまくいっていないので・・・
初心者のためシンプルに書けませんでした↓
StretchBlt(hNormalDC,((before+5)+(bmpInfo.bmWidth/4)),
(((rc.bottom-bmpInfo.bmHeight)/2)+(bmpInfo.bmHeight/4)),
(((before+5)+bmpInfo.bmWidth)-(bmpInfo.bmWidth/4)),
((((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight)-(bmpInfo.bmHeight/4)),
hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
ご教授よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> StretchBlt(hNormalDC,before+5,(rc.bottom-bmpInfo.bmHeight)/2,
(before+5)+bmpInfo.bmWidth,((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight,
hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
どう見ても拡縮後のサイズを示す
(before+5)+bmpInfo.bmWidth
と
((rc.bottom-bmpInfo.bmHeight)/2)+bmpInfo.bmHeight
の指定が不明です。
水平方向と垂直方向のアスペクト比を変えたくないのであれば、ここは拡縮比率を一致させたサイズの記述になるはずですが、ここに描画開始位置の座標+元画像のサイズが記されているので、描画された結果はアスペクト比が狂ったものになります。
元画像の等倍のままで描画するのであれば、
StretchBlt(hNormalDC,before+5,(rc.bottom-bmpInfo.bmHeight)/2,
bmpInfo.bmWidth,bmpInfo.bmHeight,
hBitDC,0,0,bmpInfo.bmWidth,bmpInfo.bmHeight,SRCCOPY);
で良いはずです。
こんな時間にも関わらず瞬時に私の勘違いを性格にご指摘していただき、
大変感謝しています。
至らない部分が多いので、これからもOKWAVEでの質問もあるかと思いますが
見かけましたらよろしくお願いいたします。
No.2
- 回答日時:
転送先の高さと幅の式が変だと思いますよ
StretchBltの転送先の幅と高さならば before+5 や (rc.bottom-bmINfo.bmHeight)/2は不要だと思います
これらがあると 幅は+5、高さは余白の半分を加算 といったことになり、希望の大きさより大きくなります
左上の点と右下の点を指示ではなく 左上の点と幅、高さを指示という仕様ですから
たとえば 100x150画像を 20,30を左上で描画する場合
StretchBlt( hDC, 20, 30, 100, 150, ...
といった具合です
これが 100,15を左上で描画する際も
StretchBlt( hDC, 100, 15, 100, 150, ...
といった具合に変化するだけですよ ・・・
ありがとうございました。
確かに左上の座標と右下の座標を指定するのだと勘違いしておりました。
即解決いたしました。相談させていただいてよかったです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
VB.netでのライン描画方法がわ...
-
c++ ダブルバッファリング、以...
-
自分のクラスにイベントを入れ...
-
グラフの交点の求め方(Excel)
-
「アイテムは収集されました」...
-
エクセルで作った新しいウイン...
-
勝手にウィンドウが開いて止ま...
-
エクセルのコントロールツール...
-
メッセージボックスを大きくす...
-
コンテキスト依存とは?
-
D3DXCreateFontとID3DXFont::Dr...
-
他のウィンドウのボタンを自動...
-
閉図形の座標の配列が右回りか...
-
空のリストビューで1行おきに...
-
マインクラフト(pc版)で座標...
-
【VB2008】 マウス操作の一時的...
-
スピンボタンを右クリックして...
-
エクセルである行が急に消えて...
-
コントロールの書式設定で、“コ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
panelのスクロール表示について
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
CScrollViewの使用方法について
-
GDI+について
-
VC++プログラムをつかったBMP画...
-
ウインドウサイズを変更しても...
-
VB6,リストボックスの特定行の...
-
タブをオーナードローすると、...
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
C++にて、塗りつぶされた円を描...
おすすめ情報