第6回 画像の縦横比を保ったまま拡大縮小する

ImageViewer06_01.gif
前回までにウインドウにJPEG画像を表示する処理を作成した。しかし表示される画像は縦横比に関係なく拡大縮小されてしまっている。そのため今回は縦横比を保ったまま拡大縮小させる。

ImageViewerView.hを開く。ここで赤枠内を修正する。この部分は画像表示をするクライアント領域の取得と画像の描画をしている。
DraiImage()は第一引数にImage、それ以降の4引数はそれぞれ描画開始XY位置と描画サイズを示している。

ImageViewer06_02.gif 赤枠のように変更した。かなり長いソースコードになってしまった。しかし処理内容自体は非常に簡単だ。画像とウインドウの縦横比を比較して、画像の方が横長なら画像の縦方向に余白を作る、などのようにしている。
		//画像表示サイズ計算
		RECT	rect;
		UINT	nImageWidth;
		UINT	nImageHeight;
		UINT	nWindowWidth;
		UINT	nWindowHeight;
		UINT	nWidth;
		UINT	nHeight;

		//画像サイズ
		nImageWidth = pImage->GetWidth();
		nImageHeight = pImage->GetHeight();

		//クライアント領域サイズ
		GetClientRect(&rect);
		nWindowWidth = rect.right - rect.left;
		nWindowHeight = rect.bottom - rect.top;

		if((double)nImageWidth / nImageHeight < (double)nWindowWidth / nWindowHeight)
		{
			//クライアント領域の方が横長なら、縦方向はいっぱいに表示
			nHeight = nWindowHeight;
			nWidth = nWindowHeight * nImageWidth / nImageHeight;
		}
		else
		{
			//画像の方が横長なら、横方向はいっぱいに表示
			nWidth = nWindowWidth;
			nHeight = nWindowWidth * nImageHeight / nImageWidth;
		}

		//画像表示
		cGraphics.DrawImage(pImage,(REAL)0,(REAL)0,(REAL)nWidth,(REAL)nHeight);

ImageViewer06_03.gif
実際に実行してみると縦横比が崩れずに拡大縮小できるようになった。

プロジェクトファイルをダウンロード


カテゴリー「画像表示ソフトを作る」 のエントリー