ここから本文です

C# 座標のRGBを取得。 画像がクリックされたらクリックイベントが発生して、クリ...

m_s********さん

2013/11/1120:27:47

C# 座標のRGBを取得。
画像がクリックされたらクリックイベントが発生して、クリックした座標の色をRGBにして、NumericUpDownに代入するというプログラムを作っています。いかがそのプログラムです。

//画像上でマウスがクリックされたら
private void pBLShow_MouseClick(object sender, MouseEventArgs e)
{
//座標のX,Yの宣言
int X = Cursor.Position.X;
int Y = Cursor.Position.Y;

//マウスポインタを(0,0)へ
Cursor.Position = new Point(0, 0);
//nUD1-3はNumericUpDownのことです。pBLShowはピクチャーボックスのことです。
int LR = (int)nUD1.Value;
int LG = (int)nUD2.Value;
int LB = (int)nUD3.Value;
Bitmap bitmap = new Bitmap(pBLShow.Image);

//クリック時のカーソル位置
Point pt = e.Location;
//ここら辺からよくわからなくなりました。
Color LC = Color.FromArgb(LR, LG, LB);
//pxCに座標の色を代入します。
Color pxC = bitmap.GetPixel(X, Y);
//LCにpxCの色を代入します。
LC = pxC;
//ここからLR,LG,LBにRGBの色を代入するプログラムを書きたいのですが、よくわからなくなってきました。方法を教えてください。
}


またこの状態で実行して画像をクリックすると

パラメーターは正の値で、幅より小さい値を指定しなければなりません。
パラメーター名:x

というエラーがでてきます。こちらの解決策も教えていただけると助かります。

補足int X = e.Location.X;
int Y = e.Location.Y;

Cursor.Position = new Point(0, 0);

Point pt = e.Location;

Color pxC = bitmap.GetPixel(pt.X, pt.Y);
//Color pxC = bitmap.GetPixel(X, Y)もやりました。

上記のように書き換えたのですが、やはり

パラメーターは正の値で、幅より小さい値を指定しなければなりません。
パラメーター名:x

というエラーが発生します…

NumericUpDown,Bitmap bitmap,bitmap.GetPixel,object sender,パラメータ,Cursor.Position,nUD1.Value

閲覧数:
3,309
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

egg********さん

編集あり2013/11/1122:01:34

補足見ました。
ピクチャボックスの画像のサイズはピクチャボックスと同じ、もしくはそれより大きいでしょうか?
また、画像を拡大させて表示していませんか?

//座標のX,Yの宣言
int X = e.Location.X;
int Y = e.Location.Y;

//マウスポインタを(0,0)へ
Cursor.Position = new Point(0, 0);
//nUD1-3はNumericUpDownのことです。pBLShowはピクチャーボックスのことです。

Bitmap bitmap = new Bitmap(pBLShow.Image);

//クリック時のカーソル位置
Point pt = e.Location;
//ここら辺からよくわからなくなりました。
Color LC = new Color();
//pxCに座標の色を代入します。
Color pxC = bitmap.GetPixel(X, Y);
//LCにpxCの色を代入します。
LC = pxC;

//ここからLR,LG,LBにRGBの色を代入するプログラムを書きたいのですが、よくわからなくなってきました。方法を教えてください。
int LR = LC.R;
int LG = LC.G;
int LB = LC.B;

nUD1.Value = LR;
nUD2.Value = LG;
nUD3.Value = LB;

色のR,G,BはColorのR,G,Bプロパティで取得できます。

また、LR,LG,LBの宣言のところですが、int LR = (int)nUD1.Value;とすると、LRの値が変わってもnUD1.Valueの値は変わりません。
nUD1.Valueに代入する必要があります。なので宣言は後ろのほうに持ってきました。

Color LC = Color.FromArgb(LR, LG, LB);というところですが、RGBから色を作らなくても、new Color();で大丈夫です。

エラーについてですが、Cursor.Positionは、画面の左上を(0,0)としてカーソルの座標を取得するものであって、ピクチャボックスの左上を(0,0)としているのではありません。だから、Cursor.Positionが画像の幅を超えたときにエラーが出ます。
e.Locationは、ピクチャボックスの左上を原点とした座標です。

質問した人からのコメント

2013/11/11 22:02:21

http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1311635114...に続きがあります。お願いします。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる