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

画像(Imageオブジェクト)を描画する

注意:画像の表示方法が分からないという方は、まず「コントロールやフォームに画像を表示する」をご覧ください。
注意:Graphicsクラスを使ってコントロールに画像を表示する方法の説明は、「コントロールやフォームに画像を表示する」に移動しました。

画像を描画するには、Graphics.DrawImageメソッドを使います。描画したいImageオブジェクトと、描画する位置、サイズを指定します。

以下の例では、画像ファイル「C:\test\1.bmp」をPictureBoxコントロール(PictureBox1)の (20, 10) の位置に、基の画像と同じ大きさ(ピクセルサイズ)で表示しています。

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

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

'画像ファイルを読み込んで、Imageオブジェクトとして取得する
Dim img As Image = Image.FromFile("C:\test\1.bmp")
'画像をcanvasの座標(20, 10)の位置に描画する
g.DrawImage(img, 20, 10, img.Width, img.Height)
'Imageオブジェクトのリソースを解放する
img.Dispose()

'Graphicsオブジェクトのリソースを解放する
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);

//画像ファイルを読み込んで、Imageオブジェクトとして取得する
Image img = Image.FromFile(@"C:\test\1.bmp");
//画像をcanvasの座標(20, 10)の位置に描画する
g.DrawImage(img, 20, 10, img.Width, img.Height);
//Imageオブジェクトのリソースを解放する
img.Dispose();

//Graphicsオブジェクトのリソースを解放する
g.Dispose();
//PictureBox1に表示する
PictureBox1.Image = canvas;

上の例で使用しているGraphics.FromImageメソッドについては「プログラムで画像を動的に作成する」を、Image.FromFileメソッドについては「画像ファイルを読み込み、Imageオブジェクトを作成する」をご覧ください。

自動スケーリングについて

上の例では、座標と大きさを指定してDrawImageメソッドを呼び出しています。DrawImageメソッドは大きさを指定しないで呼び出すこともでき、その場合は画像の大きさで描画されます。よって画像と同じ大きさで描画するならば指定する必要がないように思えますが、そうとも言えません。大きさを指定しないと、予想外の大きさで描画されることがありますし、パフォーマンスも低下します。

というのは、DrawImageメソッドに大きさを指定しなかった時に描画される画像の大きさというのが、物理的な大きさだからです。そのためDrawImageメソッドは画像の解像度(dpi)情報を使って計算した物理的な大きさに拡大あるいは縮小して描画します。これは、GDI+の自動スケーリングといわれる機能です。

自動スケーリングは、そうさせたいのであれば便利な機能かもしれませんが、ほとんどの場合ありがた迷惑です。自動スケーリングをしないで、元のピクセルサイズで画像を描画するには、上記の例のように、画像のピクセルサイズを指定してDrawImageメソッドを呼び出します。詳しくは「方法 : 自動スケーリングを解除してパフォーマンスを向上させる」をご覧ください。

補足:DrawImageメソッドの代わりにGraphics.DrawImageUnscaledメソッドを使用すると、大きさを指定しても無視して、自動スケーリングされます。

画像を拡大、縮小(スケーリング)して描画する

基の画像のサイズと違うサイズを指定してGraphics.DrawImageメソッドで描画すると、そのサイズに画像が拡大、縮小されて描画されます。これを使用して、画像の縮小、拡大(スケーリング)が簡単にできます。

次の例では、もとの画像を2倍(ピクセルサイズ)にしてPictureBox1に表示しています。

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

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

'画像ファイルを読み込んで、Imageオブジェクトとして取得する
Dim img As Image = Image.FromFile("C:\test\1.bmp")
'画像のサイズを2倍にしてcanvasに描画する
g.DrawImage(img, 0, 0, img.Width * 2, img.Height * 2)
'Imageオブジェクトのリソースを解放する
img.Dispose()

'Graphicsオブジェクトのリソースを解放する
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);

//画像ファイルを読み込んで、Imageオブジェクトとして取得する
Image img = Image.FromFile(@"C:\test\1.bmp");
//画像のサイズを2倍にしてcanvasに描画する
g.DrawImage(img, 0, 0, img.Width * 2, img.Height * 2);
//Imageオブジェクトのリソースを解放する
img.Dispose();

//Graphicsオブジェクトのリソースを解放する
g.Dispose();
//PictureBox1に表示する
PictureBox1.Image = canvas;

補間方法を指定すると、よりきれいに画像を拡大、縮小できるかもしれません。その方法については、「補間方法を指定して画像を拡大、縮小(スケーリング)表示する」で説明しています。また、サムネールイメージ(縮小イメージ)を作成する方法については、「サムネールイメージの作成」で説明しています。

  • 履歴:
  • 2006/11/22 1番目と2番目の方法の順序を入れ替えた。
  • 2012/7/27 Graphics.DrawImageメソッド以外に関する説明を「コントロールやフォームに画像を表示する」に移動。「画像を拡大、縮小(スケーリング)して描画する」を追加。その他、大幅な書き換え。

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

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