質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

Q&A

1回答

8316閲覧

【C#】ラバーバンドでのドラッグ矩形範囲の画像切抜

Knight0218

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio 2013

Microsoft Visual Studio 2013は、Microsoftによる統合開発環境(IDE)であり、多種多様なプログラミング言語に対応しています。 Visual Studio 2012の次のバージョンです

0グッド

0クリップ

投稿2015/08/06 02:30

現在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;
}

}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

処理的には、緑のチェックが付いている方法が分かりやすいかと。
切り取り範囲分のbitmapオブジェクトを作って、元画像から指定範囲をコピーします。

※切り取り結果の保存はbitmapオブジェクトで行いますが、元のデータを上書きしないように注意。
※cropRectには、自分が切り取りたい範囲を収める必要があります。
※範囲外を指定して実行時エラーが出る場合は、事前にcropRectを処理可能な範囲内に収める処理も書いてあげてください。
※「using System.Drawing;」指定を忘れずに。

投稿2015/08/10 05:58

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問