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

画像ファイルを表示する

ピクチャボックスに画像を表示する最も簡単な方法は「ピクチャボックスに簡単に画像を表示する」で紹介しましたが、ピクチャボックスでしか使えないなど、簡単な分、融通は利きません。

コントロールに画像を描画する最も一般的な方法は、GraphicsクラスのDrawImageメソッドを使う方法です。例えばピクチャボックスに画像を表示するときは、そのピクチャボックスのGraphicsオブジェクトを取得し、DrawImageメソッドで画像を描画すればよいのです。

それではGraphicsオブジェクトを取得するにはどのようにすればよいのでしょうか?よく使われる方法は次の2つです。

  1. Paintイベントハンドラ等のパラメータから取得する。
  2. Control.CreateGraphicsメソッドにより取得する。

Paintイベントで描画する方法

まずは1番目の方法から説明します。Paintイベントハンドラでは、パラメータとして渡されるPaintEventArgsオブジェクトのGraphicsプロパティによりGraphicsオブジェクトを取得できますので、これを使って描画します。

次の例では、画像ファイルをBitmapオブジェクト(System.Drawing名前空間)に読み込み、その画像をピクチャボックス(PictureBox1)のPaintイベントハンドラで描画することにより、画像を表示しています。なおImage.FromFileメソッドについては、「画像ファイルを読み込む」をご覧ください。

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

'画像ファイルを読み込む
Private _bmp As Image = Image.FromFile("C:\Blue hills.jpg")

'PictureBox1のイベントハンドラ
Private Sub PictureBox1_Paint(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.PaintEventArgs) _
        Handles PictureBox1.Paint
    'DrawImageメソッドで画像を表示する
    e.Graphics.DrawImage(_bmp, 0, 0, _bmp.Width, _bmp.Height)
End Sub
C#
コードを隠すコードを選択
//using System.Drawing;

//画像ファイルを読み込む
Image _bmp = Image.FromFile(@"C:\Blue hills.jpg");

//PictureBox1のイベントハンドラ
private void PictureBox1_Paint(object sender,
    System.Windows.Forms.PaintEventArgs e)
{
    //DrawImageメソッドで画像を表示する
    e.Graphics.DrawImage(_bmp, 0, 0, _bmp.Width, _bmp.Height);
}
補足:フォームに画像を表示させる場合は、上記と同様にPaintイベントハンドラを使う方法以外に、OnPaintメソッドをオーバーライドし、その内で画像を描画する方法も良く使われます。

Paintイベントを発生させる方法

表示している画像を変更した場合は、新しい画像を表示するためにPaintイベントを呼び出す必要があります。コントロールのPaintイベントを発生させるには、コントロールのInvalidateメソッド(または、Refreshメソッド)を呼び出します。例えばピクチャボックスのリサイズによって画像を描きなおす必要があるときは、次のようにピクチャボックスのResizeイベントハンドラでInvalidateメソッドを呼び出し、Paintイベントを発生させます。

VB.NET
コードを隠すコードを選択
'PictureBox1のResizeイベントハンドラ
Private  Sub PictureBox1_Resize(ByVal sender As Object, _
        ByVal e As System.EventArgs) _
        Handles PictureBox1.Resize
    DirectCast(sender, PictureBox).Invalidate()
End Sub
C#
コードを隠すコードを選択
//PictureBox1のResizeイベントハンドラ
private void PictureBox1_Resize(object sender, System.EventArgs e)
{
    ((PictureBox) sender).Invalidate();
}

なおInvalidateメソッドやRefreshメソッドに関しては、こちらで詳しく説明しています。

CreateGraphicsメソッドを使う方法

Paintイベントによる方法が使えない場合は、こちらの方法となります。

コントロールやフォームに画像を描画するために使用するGraphicsオブジェクトは、Control.CreateGraphicsメソッドにより取得できます。CreateGraphicsメソッドにより取得したGraphicsオブジェクトは、使用後Disposeメソッドにより破棄する必要があります。

次のコードはその例として、ピクチャボックス(PictureBox1)の座標(60, 10)に画像を表示させています。

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

Dim _bmp As Image = Image.FromFile("C:\Blue hills.jpg")

'PictureBox1のGraphicsオブジェクトの作成
Dim g As Graphics =  PictureBox1.CreateGraphics()

'画像の描画
g.DrawImage(_bmp, 60, 10, _bmp.Width, _bmp.Height)

'BitmapとGraphicsオブジェクトを破棄
_bmp.Dispose()
g.Dispose()
C#
コードを隠すコードを選択
//using System.Drawing;

Image _bmp = Image.FromFile(@"C:\Blue hills.jpg");

//PictureBox1のGraphicsオブジェクトの作成
Graphics  g= PictureBox1.CreateGraphics();

//画像の描画
g.DrawImage(_bmp, 60, 10, _bmp.Width, _bmp.Height);

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

このような方法で描画された画像は、他のウィンドウの後ろに隠れたりすることにより、簡単に消えてしまいます。これを解決するには、先に紹介したPaintイベントで描画する方法をお使いください。

注意:PictureBox1のPaintイベントハンドラに上記のコードを記述しないでください。正しく表示されなくなります。

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

ここからは補足です。ここで紹介した例では、DrawImageメソッドに画像を表示する座標と大きさを指定しています。大きさを指定せずに座標だけを指定することもできますが、これではGDI+の自動スケーリングが働き、意図せぬ大きさで描画されたり、パフォーマンスが落ちたりする可能性があります。これを回避するためには、上記のコードのように元の画像の大きさを指定してDrawImageメソッドで描画するか、DrawImageメソッドの代わりにDrawImageUnscaledメソッドを使用します。自動スケーリングについて詳しくは自動スケーリングの解除によるパフォーマンスの向上をご覧ください。

  • 履歴:
  • 2006/11/22 1番目と2番目の方法の順序を入れ替えた。

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

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