矩形領域への画像出力について



やあみんな、今日はちょっと当たり前そうなんだけど、書き残しておきたい話をするぞ。まあ、StretchBlt絡みと言えばStretchBlt絡みの話題かな。
ある決まったサイズの矩形領域があって、任意のサイズ・縦横比の画像全体を、このサイズ固定の矩形領域に描画して見せたいなんてことがあると思う。サイズ固定の矩形領域の使い方としては当然、入力の画像の全体をできるだけ大きく見せたいから、矩形領域の縦か横かを、フルに使って画像を描画したいと思うよな。つまり、どんな画像がきても、矩形領域の中における表示は、この2パターンのいずれかになっているということだ。上の画像は、ちょうどそのシチュエーションを表したものだ。

なので最終的に画像を貼り付ける処理としては、

  • 矩形領域の高さがフルに使われるように画像の高さを縮小し、画像の幅も、画像の高さと同じ比率だけ縮小するか、
  • 矩形領域の幅がフルに使われるように画像の幅を縮小し、画像の高さも、画像の幅と同じ比率で縮小するか

の2種類用意しなくてはなーということがわかる。ここまではいい、完璧だ。
問題は、どういう条件判定をすれば、上述の2種類の処理のいずれかに、正しく処理を流してやることができるだろうかということなんだね。
そうすると中には短絡的に「画像の幅が大きければ幅マックスに、画像の高さの方が大きければ、高さをマックスに表示すればいいんじゃね?」と考えてしまう子供たちが結構いるようだった。しかしこれではだめなんだね。それが成り立つのは、画像サイズのアスペクト比よりも矩形サイズのアスペクト比の方がより緩い(1に近い)時だけだ。今回の目的を達成するための条件として十分ではないんだね。
結論から言ってしまえば、正解は

「矩形領域のアスペクト比(幅を高さで割った値)が、画像サイズのアスペクト比よりも大きければ横方向をフルに使う処理を、そうでなければ縦方向をフルに使う処理を使う。」
ということになる。こうすれば冒頭の、任意のサイズの画像全体を、ある決まった矩形領域にできるだけ大きく描画するという処理を実現できるんだ。要はアスペクトの大小で比べるということだな。どうだろう勉強になったかな。ではまた次回に!