例えば、画像を縦横2倍に拡大すると画像に隙間が生まれてしまうため、この隙間をどのように埋めるか?の手法を補間と呼び、C#ではGraphicsクラスのInterpolationModeプロパティを設定することで、DrawImageメソッドが補間処理を行ってくれます。
■■■
■■■
■■■
↓ x2倍に拡大
■□■□■
□□□□□
■□■□■
□□□□□
■□■□■
(コード例)
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
using (var bmp = new Bitmap(@"C:\Temp\Parrots.bmp"))
using (var g = Graphics.FromImage(pictureBox1.Image))
{
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;
g.DrawImage(
bmp,
new RectangleF(0, 0, 500, 500),
new RectangleF(170, 100, 50, 50),
GraphicsUnit.Pixel);
}
デフォルトではInterpolationModeはBilinearに設定されていますが、このInterpolationModeを変えながら実行した結果が以下の通りです。
InterpolationMode.NearestNeighbor
InterpolationMode.Bilinear
InterpolationMode.Bicubic
InterpolationMode.Default
InterpolationMode.Low
InterpolationMode.High
InterpolationMode.HighQualityBilinear
InterpolationMode.HighQualityBicubic
NearestNeighbor、Bilinear、Bicubicの処理アルゴリズムについては、下記ページを参照下さい。
処理結果の画像を見ると、私の感覚では
NearestNeighbor→Default、Bilinear、Low→HighQualityBilinear→Bicubic→High、HighQualityBicubicの順で良くなる感じでしょうか??
どのモードを使ったら良いか?ですが、画像処理を行う場合は1画素1画素が見えるNearestNeighborがおススメです。描画速度も一番速いと思います。
写真のようなビューアのプログラムではHighQualityBicubicあたり?
ここでは画像の拡大の時の比較を行っていますが、縮小のとき、Bicubicでは25%以下のとき、Bilinearでは50%以下のとき、適していないとのこと。
(参考)
←画像処理のためのC#テクニックへ戻る
コメント