【C#】ラバーバンドでのドラッグ矩形範囲の画像切抜
現在C#にて画像を表示してラバーバンドで選択した範囲のみを切り抜いて画像ファイルとして保存する。
というツールを製作しているのですが、ラバーバンドの表示やピクチャボックス全体の画像ファイルの保存はできたのですが選択範囲のみを切り抜いて保存すると言う処理が私にはかけません。。
どなたか助けてはいただけないでしょうか?
public partial class Form1 : Form
{
private int _xi, _yi, _xc, _yc;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
//OpenFileDialogクラスのインスタンスを作成
OpenFileDialog ofd = new OpenFileDialog();
//はじめのファイル名を指定する
ofd.FileName = "";
//はじめに表示されるフォルダを指定する
ofd.InitialDirectory = @"C:\";
//[ファイルの種類]に表示される選択肢を指定する
ofd.Filter =
"TIFFファイル(*.tif;*.tiff)|*.tif;*.tiff|JPEGファイル(*.jpg;*.jpeg)|*.jpg;*.jpeg|PNGファイル(*.png)|*.png|ビットマップ(*.bmp)|*.bmp|すべてのファイル(*.*)|*.*";
//[ファイルの種類]ではじめに
//「TIFFファイル」が選択されているようにする
ofd.FilterIndex = 1;
//タイトルを設定する
ofd.Title = "開くファイルを選択してください";
//ダイアログボックスを閉じる前に現在のディレクトリを復元するようにする
ofd.RestoreDirectory = true;
//ダイアログを表示する
if (ofd.ShowDialog() == DialogResult.OK)
{
//OKボタンがクリックされたとき
//画像の大きさをPictureBoxに合わせる
pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage;
//PictureBox1に選択した画像を表示する
pictureBox1.ImageLocation = ofd.FileName;
}
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
_xi = _xc = e.X;
_yi = _yc = e.Y;
pictureBox1.Invalidate();
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button != MouseButtons.Left) return;
_xc = e.X;
_yc = e.Y;
pictureBox1.Invalidate();
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
if(_xc == _xi && _yc == _yi) return;
int x, y, w, h;
if(_xc < _xi)
{
x = _xc;
w = _xi - _xc;
}
else
{
x = _xi;
w = _xc - _xi;
}
if(_yc < _yi)
{
y = _yc;
h = _yi - _yc;
}
else
{
y = _yi;
h = _yc - _yi;
}
e.Graphics.DrawRectangle(Pens.Black, x, y, w, h);
}
private void button2_Click(object sender, EventArgs e)
{
//SaveFileDialogクラスのインスタンスを作成
SaveFileDialog sfd = new SaveFileDialog();
// フィルターの設定
sfd.Filter = "TIFF形式|*.tif|GIF形式|*.gif|JPEG形式|*.jpeg|PNG形式|*.png|すべてのファイル(*.*)|*.*";
// ファイル保存ダイアログを表示
sfd.ShowDialog();
String extension = System.IO.Path.GetExtension(sfd.FileName);
switch (extension.ToUpper())
{
case ".TIF":
// PictureBoxのイメージをTIFF形式で保存する
pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Tiff);
break;
case ".GIF":
// PictureBoxのイメージをGIF形式で保存する
pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Gif);
break;
case ".JPEG":
// PictureBoxのイメージをJPEG形式で保存する
pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Jpeg);
break;
case ".PNG":
// PictureBoxのイメージをGIF形式で保存する
pictureBox1.Image.Save(sfd.FileName, System.Drawing.Imaging.ImageFormat.Png);
break;
}
}
補足
oboroxx様、ご回答ありがとうございます。 返信が遅れました。ご回答に対する返信方法がわからず遅くなりました。 実際の文は、かなり長いので省略して投稿しました。申し訳ありません。 実際にはご指摘の通り。バックスラッシュ(実際には¥)が必要でした。また、ファイルが.pngの 場合は、もう少し複雑ですので、実際の記述をいたします。 frm.PictureBox6.Image.Save("C:\PlanTemp\" & Format(i, "000") & BallColor & "Ball.png", System.Drawing.Imaging.ImageFormat.Png) 途中にディレクトリが幾つかと、File名を特定する文字を間接的に使用しております。 また、png画像の場合、 System.Drawing.Imaging.ImageFormat.Png が必要のようです。 実際には、このような記述で実行しております。 よろしく、お願いいたします。