ビットマップの任意の領域を他のビットマップへコピーする

ビットマップの任意の領域を他のビットマップにコピーするには Clone メソッドを用います。

Fig.1 元画像
Fig.2 中心を切り出した画像

Clone には、複数の引数がオーバーロードとして定義されています。複数定義の中から、任意の領域を指定できるメソッドを利用します。

下記のコードがビットマップの画像の中心部分を抜き出して保存するコードです。完全に同じビットマップを複製したい場合は 15~18行目を

int cut_x = 0;
int cut_y = 0;
int cut_w = w;
int cut_h = h;

とすればいいです。

というよりも、その場合は Clone() の領域指定が無いメソッドを使えばいいですね。

private void button1_Click( object sender, EventArgs e )
{

	const string FILEPATH_SRC = "c:/tmp/test_src.jpg";
	const string FILEPATH_DST = "c:/tmp/test_dst.jpg";

	// 画像をビットマップとして読み込む.
	Bitmap bmp_src = new Bitmap( FILEPATH_SRC );

	// ビットマップの画像サイズを参照する.
	int w = bmp_src.Width;
	int h = bmp_src.Height;

	// コピーする部分を決定する.
	int cut_x = w >> 2; // 4分の1.
	int cut_y = h >> 2; // 4分の1.
	int cut_w = w >> 1; // 2分の1.
	int cut_h = h >> 1; // 2分の1.
	Rectangle rect = new Rectangle( cut_x, cut_y, cut_w, cut_h );

	// ビットマップをクローンする.
	Bitmap bmp_dst = bmp_src.Clone( rect, bmp_src.PixelFormat );

	// クローンされたビットマップを保存する.
	// 第2引数でファイル形式を選べる.
	bmp_dst.Save( FILEPATH_DST, System.Drawing.Imaging.ImageFormat.Jpeg );

	// あとしまつ.
	if ( bmp_src != null )
	{
		bmp_src.Dispose();
	}

	// あとしまつ.
	if ( bmp_dst != null )
	{
		bmp_dst.Dispose();
	}

	// 保存された画像を表示する.
	try
	{
		System.Diagnostics.Process.Start( FILEPATH_SRC );
		System.Diagnostics.Process.Start( FILEPATH_DST );
	}
	catch ( Exception excp )
	{
		MessageBox.Show( excp.Message );
		return;
	}

}

コードのわかりやすさを優先して、あとしまつとして Dispose(); を明示コールしております。

実際に利用する場合は using で bmp の生成自体を囲んだほうがよいです。