画像ファイルを表示するピクチャボックスに画像を表示する最も簡単な方法は「ピクチャボックスに簡単に画像を表示する」で紹介しましたが、ピクチャボックスでしか使えないなど、簡単な分、融通は利きません。 コントロールに画像を描画する最も一般的な方法は、GraphicsクラスのDrawImageメソッドを使う方法です。例えばピクチャボックスに画像を表示するときは、そのピクチャボックスのGraphicsオブジェクトを取得し、DrawImageメソッドで画像を描画すればよいのです。 それではGraphicsオブジェクトを取得するにはどのようにすればよいのでしょうか?よく使われる方法は次の2つです。
Paintイベントで描画する方法まずは1番目の方法から説明します。Paintイベントハンドラでは、パラメータとして渡されるPaintEventArgsオブジェクトのGraphicsプロパティによりGraphicsオブジェクトを取得できますので、これを使って描画します。 次の例では、画像ファイルをBitmapオブジェクト(System.Drawing名前空間)に読み込み、その画像をピクチャボックス(PictureBox1)のPaintイベントハンドラで描画することにより、画像を表示しています。なおImage.FromFileメソッドについては、「画像ファイルを読み込む」をご覧ください。 '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 //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イベントを発生させます。 'PictureBox1のResizeイベントハンドラ Private Sub PictureBox1_Resize(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles PictureBox1.Resize DirectCast(sender, PictureBox).Invalidate() End Sub //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)に画像を表示させています。 '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() //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メソッドを使用します。自動スケーリングについて詳しくは自動スケーリングの解除によるパフォーマンスの向上をご覧ください。
注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。
|
|
Copyright(C) DOBON!. All rights reserved.
|