C#なら簡単に写真や画像の切り抜き、切り取り、トリミング加工ができます。トリミングした画像をそのままのサイズで保存したりサイズを変更(拡大または縮小)するのも簡単にできます。
Bitmap.Cloneメソッドを使う
もし画像の一部を切り抜いてそのままのサイズで保存するのであれば以下の方法が簡単でおすすめです。
System.Drawing名前空間のBitmapクラスを使います。srcFilePathは切り抜きたい画像ファイルのパス、destFilePathは切り抜いた画像をファイルとして保存するときのパスです。画像を読み込んだら画像を切り抜く範囲を指定してCloneメソッドで取得します。
切り抜く範囲はRectangleオブジェクトで指定できます。Rectangleクラスのコンストラクタの引数として
四角形の左上隅のX座標
四角形の左上隅のY座標
四角形の幅
四角形の高さ
を順に渡します。
処理が終わったら忘れずに画像リソースを解放する処理をおこないます。これを忘れるとファイルがロックされたままになり再度開いたり移動、削除などの処理ができなくなります(アプリケーションが終了したらできるようになるが…)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string srcFilePath = @"D:\aaa.png"; string destFilePath = @"D:\bbb.png"; // 画像を読み込む Bitmap srcImage = new Bitmap(srcFilePath); // 画像を切り抜く範囲を指定 Rectangle rect = new Rectangle(20, 90, 450, 100); Bitmap destImage = srcImage.Clone(rect, srcImage.PixelFormat); // 画像をPNG形式で保存 destImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png); // 画像リソースを解放 srcImage.Dispose(); destImage.Dispose(); } } |
Graphics.DrawImageメソッドを使う
他にこんな方法もあります。
Bitmapクラスに加えてGraphicsクラスもあわせて使います。これだとトリミングした画像をそのままのサイズで保存できるだけでなく、サイズを変更(拡大または縮小)することもできます。縦横のサイズ比を変更することもできます。
保存したいサイズで新しいBitmapを生成します。そしてGraphics.FromImageメソッドでGraphicsオブジェクトを生成してからDrawImageメソッドで元の画像の一部を取得します。ここではGraphics.DrawImage(Image, Rectangle, Rectangle, GraphicsUnit)を使用しています。第一引数は元になるイメージ、第二引数はトリミングしたイメージを描画する矩形、第三引数はこの矩形のなかに入る部分が元になるイメージからトリミングされます。第四引数はGraphicsUnit.Pixelを指定すると単位がピクセルになります。
終わったらBitmapだけでなくGraphicsもDisposeしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
public partial class Form1 : Form { private void button2_Click(object sender, EventArgs e) { string srcFilePath = @"D:\aaa.png"; string destFilePath = @"D:\bbb.png"; Bitmap srcImage = new Bitmap(srcFilePath); // 画像を切り抜く範囲を指定 Rectangle srcRect = new Rectangle(20, 90, 450, 100); // 切り抜かれた画像のサイズを指定 // 等倍なら Rectangle destRect = new Rectangle(0, 0, 450, 100); Rectangle destRect = new Rectangle(0, 0, 100, 50); Bitmap destImage = new Bitmap(destRect.Width, destRect.Height); Graphics graphics = Graphics.FromImage(destImage); graphics.DrawImage(srcImage, destRect, srcRect, GraphicsUnit.Pixel); graphics.Dispose(); destImage.Save(destFilePath, System.Drawing.Imaging.ImageFormat.Png); // 画像リソースを解放 srcImage.Dispose(); destImage.Dispose(); } } |
トリミングする幅を指定したらトリミングされたイメージを表示するアプリを作成します。
デザイナで以下のようなものをつくります。左側にあるのはPictureBox、右にはトリミングする幅を指定するためのNumericUpDownコントロールを配置します。
画像ファイルを読み込んだらフィールド変数にBitmapオブジェクトを保存すると同時にPictureBoxにこれを表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } Bitmap? _bitmap = null; private void ButtonOpenFile_Click(object sender, EventArgs e) { _openFileDialog.Filter = "PNGファイル(*.png)|*.png"; if (_openFileDialog.ShowDialog() == DialogResult.OK) { Image image = Image.FromFile(_openFileDialog.FileName); if (_bitmap != null) _bitmap.Dispose(); _bitmap = new Bitmap(image); image.Dispose(); pictureBox1.Image = _bitmap; } } } |
トリミングする幅を指定してボタンがクリックされたらトリミングされた状態のBitmapのサイズを計算して新しいBitmapオブジェクトを生成します。もし不正な値が設定されていてサイズが0以下になる場合は処理を打ち切ります。
処理が正常におこなわれている場合は、Graphics.DrawImageメソッドでトリミングされたBitmapを書き込みます。そしてそれをPictureBoxに表示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public partial class Form1 : Form { Bitmap? _trimmedImage = null; private void ButtonTrimming_Click(object sender, EventArgs e) { if (_bitmap == null) return; int left = (int)numericUpDownLeft.Value; int top = (int)numericUpDownTop.Value; int right = (int)numericUpDownRight.Value; int bottom = (int)numericUpDownBottom.Value; int width = _bitmap.Width - left - right; int height = _bitmap.Height - top - bottom; if(width <= 0 || height <= 0) return; Bitmap bitmap = new Bitmap(width, height); Graphics graphics = Graphics.FromImage(bitmap); Rectangle srcRect = new Rectangle(left, top, width, height); Rectangle destRect = new Rectangle(0, 0, width, height); graphics.DrawImage(_bitmap, destRect, srcRect, GraphicsUnit.Pixel); graphics.Dispose(); if (_trimmedImage != null) _trimmedImage.Dispose(); _trimmedImage = bitmap; pictureBox1.Image = _trimmedImage; } } |
元に戻すボタンがクリックされたらPictureBoxに表示されているイメージをトリミング前の状態に戻します。
1 2 3 4 5 6 7 8 9 10 11 |
public partial class Form1 : Form { private void ButtonReset_Click(object sender, EventArgs e) { pictureBox1.Image = _bitmap; if (_trimmedImage != null) _trimmedImage.Dispose(); _trimmedImage = null; } } |
保存が選択されたらトリミングされたBitmapオブジェクトをPNGファイルとして保存します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public partial class Form1 : Form { SaveFileDialog _saveFileDialog = new SaveFileDialog(); private void ButtonSaveFile_Click(object sender, EventArgs e) { if (_trimmedImage == null) return; _saveFileDialog.Filter = "PNGファイル(*.png)|*.png"; if (_saveFileDialog.ShowDialog() == DialogResult.OK) _trimmedImage.Save(_saveFileDialog.FileName); } } |