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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Vba LongPtrについて教えてください 2 2022/08/19 11:14
- Excel(エクセル) マクロだと数式が表示される 2 2022/09/10 14:48
- 工学 制御工学の問題について 2 2022/10/30 20:20
- HTML・CSS スクロールすると追従する画像のコードを書いているのですが、追従する画像の大きさの調節が上手くいきませ 2 2022/04/18 12:52
- その他(データベース) 「1004:アプリケーション定義またはオブジェクト定義のエラー」への解消方法に関して 1 2023/07/09 11:47
- 物理学 方形波 x(t)が入力された時の出力y(t)を、コンボリュージョンを用いて求めよ。 画像の1.2.3 2 2022/10/10 14:06
- その他(スマホアプリ・スマホゲーム) アプリをスマホにダウンロード、インストールする方法 3 2022/08/13 11:26
- オープンソース cssで中央寄せ 1 2023/05/19 06:25
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
このQ&Aを見た人はこんなQ&Aも見ています
-
「環境が人を育てる」って本当?環境によって人格や生き方は本当に変わるのか
環境が人生に与える影響は実際どれほどのものなのか、専門家の田宮由美さんに伺った。
-
VC++プログラムをつかったBMP画像の拡大縮小について
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?
C言語・C++・C#
-
-
4
MFCでOnPaintのタイミング
C言語・C++・C#
-
5
ビットマップを表示させる(MFC)
C言語・C++・C#
-
6
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
7
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
8
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
9
ダイアログにビットマップを貼り付けた時にフリーズしてしまう
C言語・C++・C#
-
10
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
11
CImageクラスの使用について
C言語・C++・C#
-
12
文字列がNULLか空文字列かの判定
C言語・C++・C#
-
13
PictureControlのハンドルをCImageで取得
C言語・C++・C#
-
14
LoadImage関数について(VC++)
C言語・C++・C#
-
15
画像の保存方法。
C言語・C++・C#
-
16
ウィンドウの背景に画像を配置する
C言語・C++・C#
-
17
C++初心者です。 debug assertion errorについて
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAにGDI+を参照させる方法
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
[VB.net] DataGridViewの列ヘッ...
-
OneNote 2010 文字と描画がずれる
-
VC++プログラムをつかったBMP画...
-
塗りつぶしモード ALTERNATEと...
-
CScrollViewの使用方法について
-
win32api 画面のちらつき
-
NVIDIAのシェーダーキャッシュ
-
InvalidateRectの使い方について
-
GDI+のDrawStringを使って文字...
-
MFCのタイマーのつかい方を教え...
-
画像の印刷について
-
Form1 Load で実行されない。
-
CStaticコントロールの静的イメ...
-
VB.netでのライン描画方法がわ...
-
MFC DrawText 背景色とフォント
-
VB6,リストボックスの特定行の...
-
word
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
TextBoxに文字を書いても表示さ...
-
word
-
MFCでOnPaintのタイミング
-
エクセルでガンチャートを作成...
-
MFCのタイマーのつかい方を教え...
-
InvalidateRectの使い方について
-
VC++プログラムをつかったBMP画...
-
CScrollViewの使用方法について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
VBAにGDI+を参照させる方法
-
C++にて、塗りつぶされた円を描...
-
GetGlyphOutline() ご利用経験...
おすすめ情報