ビットマップの任意の領域を他のビットマップへコピーする
ビットマップの任意の領域を他のビットマップにコピーするには Clone メソッドを用います。
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 の生成自体を囲んだほうがよいです。