dポイントプレゼントキャンペーン実施中!

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);

ご教授よろしくお願いします。

A 回答 (2件)

> 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);

で良いはずです。
    • good
    • 0
この回答へのお礼

こんな時間にも関わらず瞬時に私の勘違いを性格にご指摘していただき、
大変感謝しています。
至らない部分が多いので、これからもOKWAVEでの質問もあるかと思いますが
見かけましたらよろしくお願いいたします。

お礼日時:2010/06/10 03:18

転送先の高さと幅の式が変だと思いますよ


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, ...
といった具合に変化するだけですよ ・・・
    • good
    • 0
この回答へのお礼

ありがとうございました。
確かに左上の座標と右下の座標を指定するのだと勘違いしておりました。
即解決いたしました。相談させていただいてよかったです。

お礼日時:2010/06/10 03:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A