WisdomSoft - for your serial experiences.

6.2 画像を表示する

画像ファイルを読み込み、フォーム上に描画します。読み込んだイメージは伸縮させたり、画像の一部だけを描画させたりできます。

6.2.1 Image オブジェクトを描画する

ディスクファイルからデータを読み込んで Image オブジェクトを取得できればイメージを描画することができます。イメージの描画は、これまで図形やテキストを描画したときと同じように Graphics クラスの DrawImage() メソッドで Graphics オブジェクトが参照しているデバイスに出力することができます。

Graphics クラス DrawImage() メソッド
public void DrawImage(Image image, Point point)
public void DrawImage(Image image, int x, int y)

image パラメータには描画する Image オブジェクトを指定します。Point オブジェクトを指定する場合は、描画するイメージの矩形の左上隅の座標を指定します。int 型の x と y を指定する場合は、x に X 座標を、y には Y 座標を指定します。Win32 API を使ってイメージをウィンドウに描画するプログラムを書いたことがある方であれば、とてもシンプルにイメージを扱えることに驚くでしょう。

コード1
using System.Drawing;
using System.Windows.Forms;

public class Test : Form
{
	private Image image;
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint (e);
		if (image == null) image = Image.FromFile("test.bmp");
		e.Graphics.DrawImage(image, 0, 0);
	}

	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード1 実行結果

コード1は、実行ファイルと同じディレクトリにある test.bmp ファイルを読み込んで、ウィンドウにイメージを描画するプログラムです。Image オブジェクトを取得することができれば、イメージの描画は簡単なものであることが分かります。DrawImage() メソッドは抽象クラスの Image オブジェクトを受け取るため、イメージの実装がビットマップでもメタファイルでも同じ操作で描画することができます。

6.2.2 イメージを伸縮する

座標のみを指定する DrawImage() メソッドは Image オブジェクトの実サイズで描画します。イメージの物理的なサイズではなく、具体的に描画サイズを指定する必要がある場合は、座標に加えて描画サイズを指定します。

Graphics クラス DrawImage() メソッド
public void DrawImage(Image image, Rectangle rect)
public void DrawImage(Image image, int x, int y, int width, int height)

rect には出力先デバイスにイメージを描画する矩形を指定します。width と height の場合も同様で、width にはイメージの幅を、height にはイメージの高さを指定します。

コード2
using System.Drawing;
using System.Windows.Forms;

public class Test : Form
{
	private Image image;
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint(e);
		if (image == null) image = Image.FromFile("test.bmp");
		e.Graphics.DrawImage(image, 0, 0, ClientSize.Width, ClientSize.Height);
	}
	protected override void OnResize(System.EventArgs e)
	{
		base.OnResize(e);
		Invalidate();
	}

	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード2 実行結果

コード2は、常にフォームのクライアント領域全体にイメージを伸縮して描画するプログラムです。このプログラムの場合、DrawImage() メソッドのサイズ指定にフォームの幅と高さを指定しています。そのため、フォームのサイズを変更するとイメージはフォームのクライアントサイズに自動的に伸縮されます。

6.2.3 イメージの一部を描画する

描画する元の Image オブジェクトから特定の領域だけを描画したい場合、元のイメージのピクセル情報を操作する必要はありません。描画時に DrawImage() メソッドでイメージの描画する部分だけを矩形で選択することができます。

Graphics クラス DrawImage() メソッド
public void DrawImage(
    Image image, int x, int y, Rectangle srcRect, GraphicsUnit srcUnit
)
public void DrawImage(
    Image image, Rectangle destRect, Rectangle srcRect, GraphicsUnit srcUnit
)
public void DrawImage(
    Image image, Rectangle destRect,
    int srcX, int srcY, int srcWidth, int srcHeight, GraphicsUnit srcUnit
)

x パラメータと y パラメータには、描画するイメージの一部の出力先の X 座標と Y 座標を指定します。

srcRect パラメータには、イメージの描画する部分を表す矩形を指定します。destRect パラメータを指定する場合は、イメージの出力先の矩形を指定することでイメージを矩形のサイズに伸縮します。

srcX パラメータ、srcY パラメータには描画するイメージの左上隅の X 座標と Y 座標を、srcWidth パラメータにはイメージの一部の幅、srcHeight パラメータには高さを指定します。

srcUnit パラメータには、抽出元イメージの矩形を指定する値の単位を表す GraphicsUnit 列挙体のメンバのいずれかを指定します。

図1 ソースイメージの一部だけを描画
図1 ソースイメージの一部だけを描画
コード3
using System.Drawing;
using System.Windows.Forms;

public class Test : Form
{
	private Image image;
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint (e);
		if (image == null) image = Image.FromFile("test.bmp");

		Rectangle srcRect = new Rectangle(20, 50, 100, 150);
		Rectangle destRect = new Rectangle(150, 0, 200, 300);
		e.Graphics.DrawImage(image, 0, 0, srcRect, GraphicsUnit.Pixel);
		e.Graphics.DrawImage(image, destRect, srcRect, GraphicsUnit.Pixel);
	}

	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード3 実行結果

コード3は、ディスクから読み込んだイメージから、さらに特定の部分だけを描画するというプログラムです。イメージの一部分だけを伸縮して描画するという処理には、直接イメージのデータを操作する必要はなく、このように DrawImage() メソッドのパラメータで指定するだけで実現することができます。伸縮と組み合わせることで、画像の一部を拡大して表示させるということも可能です。

6.2.4 平行四辺形に描画

イメージの描画を行う座標または矩形を指定した場合は、伸縮を行うことができるもののイメージを回転させることはできません。イメージを斜めにして描画するには、DrawImage() メソッドに座標や矩形ではなく平行四辺形を定義する 3 つの座標配列を渡す必要があります。

Graphics クラス DrawImage() メソッド
public void DrawImage(Image image, Point[] destPoints)
public void DrawImage(Image image, Point[] destPoints, Rectangle srcRect, GraphicsUnit srcUnit)

このオーバーロードされた DrawImage() メソッドは、destPoints に平行四辺形を定義する 3 つの座標を指定します。この Point 構造体型の配列は、先頭要素から平行四辺形の左上隅、右上隅、左下隅を表します。4点目の右下隅はこれら3つの点から推定することができます。

コード4
using System.Drawing;
using System.Windows.Forms;

public class Test : Form
{
	private Image image;
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint (e);
		if (image == null) image = Image.FromFile("test.bmp");

		Point[] pts = { new Point(200, 0), new Point(400, 200), new Point(0, 200) };
		e.Graphics.DrawImage(image, pts);
	}

	static void Main() 
	{
		Application.Run(new Test());
	}
}
実行結果
コード4 実行結果

コード4は、平行四辺形を定義する 3 つの Point 構造体型の配列を作成して描画を行っています。DrawImage() メソッドの結果は、定義した平行四辺形に伸縮されてイメージが描画されます。イメージを回転させたい場合に、この方法が使えます。