WisdomSoft - for your serial experiences.

6.5 イメージを保存する

Image オブジェクトが保持している画像データを PNG や JPEG といった画像ファイルとして出力します。

6.5.1 画像ファイルとしてイメージを出力する

アプリケーションで生成したり編集した Image オブジェクトは、アプリケーションを終了させるとメモリから消えてしまいます。編集したデータを保存するには、Image オブジェクトのデータを適切に変換してハードディスクドライブなどの記録装置に出力しなければなりません。他のイメージエディタやイメージビューワでイメージを開けるようにディスクに保存するには .bmp や .jpg など、標準的なファイルフォーマットで保存する必要があります。

純粋な IO 処理でファイルに保存しようとした場合、バイナリデータとして出力する必要があるため Image オブジェクトのピクセルデータを正しく変換して、ファイルフォーマットで定められている仕様に基づいて保存しなければなりません。この作業は、ビットマップに関する正確な知識と緻密な出力処理が要求されるため簡単なものではありません。

幸い Image クラスを使えば、ビットマップや JPEG のファイルフォーマットの中身を知らなくても、用意にメソッドひとつで保存することができます。Image クラスには Save() メソッドが用意されているので、このメソッドを呼ぶことで実装に従って適切なフォーマットで出力できます。

Image クラス Save() メソッド
public void Save(string filename)

filename パラメータには Image オブジェクトの画像ファイルを保存するファイル名を指定します。

このメソッドを用いた場合は、ファイル拡張子に関係なく常に PNG 形式で保存されます。ファイル拡張子でフォーマットを判断してくれた方が便利なのではと思われますが(実際に .NET Framework がベータ版のときは拡張子でフォーマットを判断する仕様だった) Image クラスは透明ピクセルをサポートしているため、透明なピクセルを確実に表現できる PNG 形式を既定のフォーマットにしたのだと考えられます。

ファイルフォーマットを明示的に指定したい場合は次のオーバーロードされた Save() メソッドを使います。

Image クラス Save() メソッド
public void Save(Stream stream, ImageFormat format)
public void Save(string filename, ImageFormat format)

stream パラメータにはファイルの出力先ストリームを指定します。ローカルディスク以外の特殊な出力デバイスやメモリバッファ、ネットワークなどにイメージファイルを出力したいときに使うことができます。

format パラメータにファイルフォーマットを表す ImageFormat オブジェクトを指定します。

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

public class Test : Form
{
	private Image image;
	protected override void OnPaint(PaintEventArgs e)
	{
		base.OnPaint (e);
		e.Graphics.DrawImage(image, 0, 0);
	}

	public Test() 
	{
		image = new Bitmap(400, 300);
		Graphics g = Graphics.FromImage(image);
		Brush brush = new SolidBrush(Color.Red);
		g.FillEllipse(brush, 0, 0, image.Width, image.Height);

		image.Save("test.png");
		image.Save("test.bmp", ImageFormat.Bmp);
		image.Save("test.jpg", ImageFormat.Jpeg);
	}

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

コード1を実行すると、ウィンドウには生成したイメージをそのまま表示します。このイメージは、コンストラクタで Save() メソッドを使ってディスクに保存されています。実行ファイルのディレクトリを覗くと、test.png、test.bmp、test.jpg の3つの画像ファイルが生成されて衣類ことを確認できます。

図1 生成された PNG イメージ
図1 生成された PNG イメージ
図2 生成された JPEG イメージ
図2 生成された JPEG イメージ

このように、Image クラスの Save() メソッドを呼び出すことで、ファイルフォーマットの構造を知らなくても簡単に扱うことができます。ゲームプログラミングの場合はファイルにイメージを保存する積極的な理由はありませんが、ゲーム画面のスクリーンショットの保存や、セーブファイルのサムネイル(保存時の画面の小さな画像)を保存するという利用方法が考えられます。