DOBON.NET DOBON.NETプログラミング掲示板過去ログ

画像の縦横サイズを同一にするための補完方法

環境/言語:[WinXp(Sp3)、VB.NET(VS2005)]
分類:[.NET]

画像ファイルの縦・横サイズを200ピクセルに拡大・縮小し、
保存するプログラムを作ろうとしています。

縦・横サイズが同じであれば問題ないのですが、
例えば縦:300ピクセル、横:240ピクセルなどの場合、
比率を調整した後の画像サイズは
縦:200ピクセル、横:160ピクセルとなります。
ここで横のサイズを200ピクセルになるように引き伸ばすのではなく、
40ピクセル分を白背景にしたい…不足分をなんらかの形で
補完できないものかと考えております。

40ピクセル分を動的に作る(作れるのか?)…
白い画像で200*200のものを用意し、それに加工した画像を重ねる…
…などなど、頭ではモヤモヤと浮かぶのですが、
実現方法に苦慮しております。
よろしくお願い致します。


ちなみにPG自体はDOBONさんの拡大・縮小方法のサンプルをもとにしています。
これをベースになんとかならないものかな、などと考えております。

'画像を拡大、縮小して表示する(スケーリング)
'Bitmapオブジェクトの作成
Dim img As Bitmap = New Bitmap("C:\test.bmp")
'PictureBox1のGraphicsオブジェクトの作成
Dim g As Graphics = PictureBox1.CreateGraphics()

'元の画像の大きさを1.5倍にして表示する
Dim rect As RectangleF = _
New RectangleF(0, 0, 1.5F * img.Width, 1.5F * img.Height)
g.DrawImage(img, rect)
'または、次のようにも書ける
g.DrawImage(img, 0, 100, 1.5F * img.Width, 1.5F * img.Height)

'BitmapとGraphicsオブジェクトを破棄
img.Dispose()
g.Dispose()
■No25215に返信(チャッピーヌさんの記事)
> 例えば縦:300ピクセル、横:240ピクセルなどの場合、
> 比率を調整した後の画像サイズは
> 縦:200ピクセル、横:160ピクセルとなります。
> ここで横のサイズを200ピクセルになるように引き伸ばすのではなく、
> 40ピクセル分を白背景にしたい…不足分をなんらかの形で
> 補完できないものかと考えております。

(1) 200x200 の Bitmap サイズを New Bitmap(200, 200) で生成します。

(2) 次に、Graphics.FromImage で、(1) に対する Graphics インスタンスを得ます。

(3) 元画像を、New Bitmap(fileName) や Image.FromFile などで読み込みます。

(4) (2) に対して、背景色を塗りつぶします。たとえば、不透明の白で塗りつぶすなら
 .Clear(Color.White) のようにします。

(5) さらに (2) に対して、(3) を .DrawImage(元画像, 0, 0, 160, 200) などで描画します。

(6) 描画処理はこれで完了。最後に、(1) を .Save メソッドで保存して完成です。


> ちなみにPG自体はDOBONさんの拡大・縮小方法のサンプルをもとにしています。
> これをベースになんとかならないものかな、などと考えております。

上記の手順をコード化すると、たとえばこのようになります。

Using dst As New Bitmap(200, 200) '…(1)
Using g As Graphics = Graphics.FromImage(dst) '…(2)
Using src As New Bitmap("C:\300x240.bmp") '…(3)
g.Clear(Color.White) '…(4)
g.DrawImage(src, 0, 0, 160, 200) '…(5)
End Using
End Using
dest.Save("C:\200x200.bmp") '…(6)
End Using


また、どぼん!さんの .NET Tips には、別の画像形式で保存する方法や、
背景に対して(単色の白で塗りつぶすのではなく)グラデーションをかける方法、
画像を拡大・縮小させる際の補完方法を変更する手順なども掲載されていますので
併せて参照してみてください。
魔界の仮面弁士さん、ありがとうございます!

元画像の表示位置が土台となる画像の中央になるように
教えて頂いたサンプルコードのDrawImageの
第二引数or第三引数を指定することにより
実現したかったことがクリアできました。

ありがとうございました(ノε`)・゚・。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板