DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

補間方法を指定して画像を拡大、縮小(スケーリング)表示する

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。

画像を拡大、縮小(スケーリング)して表示する方法は「画像を拡大、縮小(スケーリング)して描画する」で紹介しましたが、補間方法(内挿方法)を指定するとよりきれいに拡大、縮小できかもしれません。

Graphics.InterpolationModeプロパティにより、画像を拡大、縮小して描画する時の補間方法を変更することができます。このプロパティに設定できるInterpolationMode列挙体のメンバには、以下のようなものがあります。説明は、MSDNからの抜粋です。

InterpolationMode列挙体のメンバ名 補間方法 説明
Bicubic 双三次補間、バイキュービック法 事前フィルター処理は実行されません。このモードは、イメージを元のサイズの 25% 以下にするような縮小処理には適していません。
Bilinear 双一次補間、バイリニア法 事前フィルター処理は実行されません。このモードは、イメージを元のサイズの 50% 以下にするような縮小処理には適していません。
Default 既定のモード。(Bilinear?)
High 高品質補間
HighQualityBicubic 高品質双三次補間 事前フィルター処理が適用され、高品質の縮小処理が実行されます。このモードを使用すると、変換後のイメージが高品質になります。
HighQualityBilinear 高品質双一次補間 事前フィルター処理が適用され、高品質の縮小処理が実行されます。
Invalid QualityMode列挙体の要素Invalid(無効なモードを指定)と等価。
Low 低品質補間
NearestNeighbor 最近傍補間、ニアレストネイバー法

以上の補間方法について「アスキーデジタル用語辞典」では次のように説明されています。

「ニアレストネイバー法はその名の通り、単純に元の画像を水増し(拡大)、間引き(縮小)する方式。ジャギーが目立ちやすく階調のある画像のリサイズにはむいていない。バイリニア法、バイキュービック法は元の画像の周辺の複数の画像を数学的に算出して拡大、縮小する。バイキュービック法のほうが計算が複雑で精度が高く階調のある画像のリサイズにむいている。」

一般的に高品質の補間方法を指定したときのほうが描画に時間がかかります。

以下の例では、最近傍補間と高品質双三次補間によって画像を縮小表示しています。

VB.NET
コードを隠すコードを選択
'Imports System.Drawing

'補間方法を指定して画像を縮小して描画する

'描画先とするImageオブジェクトを作成する
Dim canvas As New Bitmap(PictureBox1.Width, PictureBox1.Height)
'ImageオブジェクトのGraphicsオブジェクトを作成する
Dim g As Graphics = Graphics.FromImage(canvas)

'Bitmapオブジェクトの作成
Dim image = New Bitmap("C:\サンプル.jpg")
'補間方法として最近傍補間を指定する
g.InterpolationMode = _
    System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
'画像を縮小して描画する
g.DrawImage(image, 0, 0, 150, 120)
'補間方法として高品質双三次補間を指定する
g.InterpolationMode = _
    System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
'画像を縮小して描画する
g.DrawImage(image, 160, 0, 150, 120)

'BitmapとGraphicsオブジェクトを破棄
image.Dispose()
g.Dispose()

'PictureBox1に表示する
PictureBox1.Image = canvas
C#
コードを隠すコードを選択
//using System.Drawing;

//補間方法を指定して画像を縮小して描画する

//描画先とするImageオブジェクトを作成する
Bitmap canvas = new Bitmap(PictureBox1.Width, PictureBox1.Height);
//ImageオブジェクトのGraphicsオブジェクトを作成する
Graphics g = Graphics.FromImage(canvas);

//Bitmapオブジェクトの作成
Bitmap image = new Bitmap(@"C:\サンプル.jpg");
//補間方法として最近傍補間を指定する
g.InterpolationMode = 
    System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
//画像を縮小して描画する
g.DrawImage(image, 0, 0, 150, 120);
//補間方法として高品質双三次補間を指定する
g.InterpolationMode = 
    System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
//画像を縮小して描画する
g.DrawImage(image, 160, 0, 150, 120);

//BitmapとGraphicsオブジェクトを破棄
image.Dispose();
g.Dispose();

//PictureBox1に表示する
PictureBox1.Image = canvas;

  • 履歴:
  • 2012/8/1 表を追加。表示する方法を、PictureBox.Imageプロパティを使った方法に変更。
  • 2013/7/6 C#のコードで、「PictureBox1.CreateGraphics」が残っていたのを削除。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • このサイトで紹介されているコードの多くは、例外処理が省略されています。例外処理については、こちらをご覧ください。
  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。