C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: Rectangleの領域設定に変数は使用可能?


(過去ログ 113 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■66739 / inTopicNo.1)  Rectangleの領域設定に変数は使用可能?
  
□投稿者/ mako_chan3 (11回)-(2013/05/21(Tue) 18:10:30)

分類:[C#] 

環境はVisualStudio2010です。

「pictureBox_MouseClickイベントで元画像をクリックした位置を(x、y)として取り込み、
 Rectangle srcRect = new Rectangle(x - 60, y - 30, x + 20, y + 10); で元画像の切り取り範囲を決定し、
 Rectangle desRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height); で描画する部分の範囲を決定する。」
と考えました。
3行目のsrcRect.WidthとsrcRect.Heightの値はそれぞれ80と40を期待したのですが、デバッグしてみるとx+80とy+60の値が格納されていました。
これは何か使い方が間違っているのでしょうか。

ソースは下記の通りです。◆のところです。

//button1のClickイベントハンドラです。
private void button1_Click(object sender, EventArgs e)
{

( 省略 )

if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
Bitmap img = new Bitmap(openFileDialog1.FileName); //画像ファイルのImageオブジェクトを作成します。

pictureBox1.Image = img;
}

}

//pictureBox1のMouseClickイベントハンドラです。
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
int x = e.X;
int y = e.Y;

Bitmap img = (Bitmap)pictureBox1.Image; //元画像のImageオブジェクトを作成する。
Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height); //描画先とするImageオブジェクトを作成。
Graphics g = Graphics.FromImage(canvas); //ImageオブジェクトのGraphicsオブジェクトを作成。

◆Rectangle srcRect = new Rectangle(x - 60, y - 30, x + 20, y + 10); //切り取る部分の範囲を決定する。
◆Rectangle desRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height); //描画する部分の範囲を決定する。ここでは、(0,0)の位置に描画する。

g.DrawImage(img, desRect, srcRect, GraphicsUnit.Pixel); //切り取った画像を描画する。

g.Dispose(); //Graphicsオブジェクトのリソースを開放する。

pictureBox2.Image = canvas; //pictureBox2に描画する。
}
引用返信 編集キー/
■66740 / inTopicNo.2)  Re[1]: Rectangleの領域設定に変数は使用可能?
□投稿者/ とっちゃん (116回)-(2013/05/21(Tue) 18:17:17)
とっちゃん さんの Web サイト
No66739 (mako_chan3 さん) に返信
>  Rectangle srcRect = new Rectangle(x - 60, y - 30, x + 20, y + 10); で元画像の切り取り範囲を決定し、
>  Rectangle desRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height); で描画する部分の範囲を決定する。」

Windows API のRECT 構造体と異なり、Rectangle(GDI+の矩形構造体)は、
( x, y, width, height ) となっています。
left, top, right, bottom の RECTとは異なりますので、結構はまりどころです。

ついでに言うと、Rectangle は、右下を含まない矩形になります。

この2点がRECT構造体とは大きく異なります。

引用返信 編集キー/
■66741 / inTopicNo.3)  Re[2]: Rectangleの領域設定に変数は使用可能?
□投稿者/ Azulean (166回)-(2013/05/21(Tue) 22:29:06)
用途次第では、この静的メソッドが使えるかもしれませんね。

Rectangle.FromLTRB メソッド
http://msdn.microsoft.com/ja-jp/library/system.drawing.rectangle.fromltrb.aspx
引用返信 編集キー/
■66746 / inTopicNo.4)  Re[1]: Rectangleの領域設定に変数は使用可能?
□投稿者/ shu (321回)-(2013/05/22(Wed) 07:50:56)
No66739 (mako_chan3 さん) に返信
> 3行目のsrcRect.WidthとsrcRect.Heightの値はそれぞれ80と40を期待したのですが、デバッグしてみるとx+80とy+60の値が格納されていました。
> これは何か使い方が間違っているのでしょうか。
既にレスがついている内容で分かると思いますが、
width=80,height=40を指定したいのであれば
Rectangle srcRect = new Rectangle(x - 60, y - 30, 80, 40);
とすればよいです。

x+20,y+10を含めたければ
Rectangle srcRect = new Rectangle(x - 60, y - 30, (x + 20) - (x - 60), (y + 10) - (y - 30));
とするとよいでしょう。

引用返信 編集キー/
■66751 / inTopicNo.5)  Re[2]: Rectangleの領域設定に変数は使用可能?
□投稿者/ mako_chan3 (12回)-(2013/05/22(Wed) 09:07:59)
No66740 (とっちゃん さん) に返信
> ■No66739 (mako_chan3 さん) に返信
>> Rectangle srcRect = new Rectangle(x - 60, y - 30, x + 20, y + 10); で元画像の切り取り範囲を決定し、
>> Rectangle desRect = new Rectangle(0, 0, srcRect.Width, srcRect.Height); で描画する部分の範囲を決定する。」
>
> Windows API のRECT 構造体と異なり、Rectangle(GDI+の矩形構造体)は、
> ( x, y, width, height ) となっています。
> left, top, right, bottom の RECTとは異なりますので、結構はまりどころです。
>
> ついでに言うと、Rectangle は、右下を含まない矩形になります。
>
> この2点がRECT構造体とは大きく異なります。
>
ありがとうございました。なんとなくではありましたが、どうも使い方がわかってないかもと感じていました。
明確な指摘を頂き納得です。
引用返信 編集キー/
■66752 / inTopicNo.6)  Re[3]: Rectangleの領域設定に変数は使用可能?
□投稿者/ mako_chan3 (13回)-(2013/05/22(Wed) 09:19:59)
No66741 (Azulean さん) に返信
> 用途次第では、この静的メソッドが使えるかもしれませんね。
>
> Rectangle.FromLTRB メソッド
> http://msdn.microsoft.com/ja-jp/library/system.drawing.rectangle.fromltrb.aspx

ありがとうございます。Rectangle FromLTRBを使ったバージョンを試してみようと思いましたが、少し時間が必要かも・・・
チャレンジしてみます。
引用返信 編集キー/
■66753 / inTopicNo.7)  Re[2]: Rectangleの領域設定に変数は使用可能?
□投稿者/ mako_chan3 (14回)-(2013/05/22(Wed) 09:29:29)
No66746 (shu さん) に返信
> ■No66739 (mako_chan3 さん) に返信
>>3行目のsrcRect.WidthとsrcRect.Heightの値はそれぞれ80と40を期待したのですが、デバッグしてみるとx+80とy+60の値が格納されていました。
>>これは何か使い方が間違っているのでしょうか。
> 既にレスがついている内容で分かると思いますが、
> width=80,height=40を指定したいのであれば
> Rectangle srcRect = new Rectangle(x - 60, y - 30, 80, 40);
> とすればよいです。
>
> x+20,y+10を含めたければ
> Rectangle srcRect = new Rectangle(x - 60, y - 30, (x + 20) - (x - 60), (y + 10) - (y - 30));
> とするとよいでしょう。
>
いつも的確なご指摘ありがとうございます。とちらの方法も一発OKでした。
やはり使い方の理解が不足していたようです。
ネットで調べても実際の使い方がわかりづらいこともあり、使ってなれていくということが大事ですね。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -