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

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

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

Re[2]: C# 座標のRGBを取得にかんして。


(過去ログ 117 を表示中)

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

■68752 / inTopicNo.1)  C# 座標のRGBを取得にかんして。
  
□投稿者/ LAT (1回)-(2013/11/11(Mon) 20:58:42)

分類:[C#] 

OS Win8.1 言語 C#
画像がクリックされたらクリックイベントが発生して、クリックした座標の色を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

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

引用返信 編集キー/
■68753 / inTopicNo.2)  Re[1]: C# 座標のRGBを取得にかんして。
□投稿者/ Jitta (87回)-(2013/11/11(Mon) 21:32:51)
Jitta さんの Web サイト
No68752 (LAT さん) に返信
> OS Win8.1 言語 C#
> 画像がクリックされたらクリックイベントが発生して、クリックした座標の色を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
> 
> というエラーがでてきます。こちらの解決策も教えていただけると助かります。

http://msdn.microsoft.com/ja-jp/library/system.windows.forms.cursor.position%28v=vs.110%29.aspx
Cursour.Position は画面座標ということです。
http://msdn.microsoft.com/ja-jp/library/ms229598%28v=vs.110%29.aspx
コントロール内の座標を表すクライアント座標に変換しないと、ビットマップ上の座標になりません。

質問文には、クリックした座標の色をピックアップしたい、と書かれていますが、
コードは、クリックした座標の色を設定する、となっています。
どちらが本当でしょう?

引用返信 編集キー/
■68755 / inTopicNo.3)  Re[1]: C# 座標のRGBを取得にかんして。
□投稿者/ 魔界の仮面弁士 (419回)-(2013/11/11(Mon) 22:00:44)
2013/11/11(Mon) 22:25:10 編集(投稿者)

No68752 (LAT さん) に返信
> NumericUpDownに代入するというプログラムを作っています。
NumericUpDown はどのように使う予定ですか?

(1)3 つの NumericUpDown に、Red/Green/Blue値を 0〜255 の範囲で表示
(2)3 つの NumericUpDown に、Cyan/Magenta/Yellow値を 0〜255 の範囲で表示
(3)1 つの NumericUpDown(Hexadecimal = true) で、16進数表記の RGB 値を RRGGBB 順に表示
(4)1 つの NumericUpDown(Hexadecimal = true) で、16進数表記の RGB 値を BBGGRR 順に表示
(5)上記以外


> //画像上でマウスがクリックされたら
> private void pBLShow_MouseClick(object sender, MouseEventArgs e)
> {
> //座標のX,Yの宣言
> int X = Cursor.Position.X;
> int Y = Cursor.Position.Y;
上記の Cursor.Position は画像上の座標ではなく、スクリーン全体の座標です。
画像上の同じ点をクリックしても、Form の位置が違っていると、異なる座標となります。

pBLShow内の左上を (0, 0)とする座標系を得たいのであれば、
Cursor.Position ではなく、e.Location を使います(既にお使いのようですが)。


> //マウスポインタを(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;
これですと、nUD1〜nUD3 に入っている値を書き換えるのではなく、
nUD1〜nUD3 に入っている値を読み取る処理になってしまいます。

やりたいことは「NumericUpDown の値を読み取る処理」ではなく、
「NumericUpDown に、色を表す値をセットする処理」だと思いますが、
だとしたら、左辺と右辺が逆です。「numericUpDown1.Value = セットしたい値;」にしましょう。


さて、そのセットしたい値とは、画像の特定座標の色ですよね。
Bitmap から、指定した座標の色を得たいのであれば、GetPixel メソッドが使えます。

GetPixel から得た色(Color)を数値や文字列に変換するには、
 ・Color の R/G/B プロパティ
 ・Color の ToArgb メソッド
 ・ColorConverter の ConvertToInvariantString メソッド
 ・ColorTranslator の ToHtml メソッド
 ・ColorTranslator の ToOle メソッド
 ・ColorTranslator の ToWin32 メソッド
と、いろいろな方法があります。

※ なお、GetPixel は比較的低速なメソッドです。今回の目的では十分かと思いますが、
 高速に処理したい場合には、LockBits / BitmapData を使う手法があります。
 (本題から外れるため、ここでは解説を省きますが)



> //クリック時のカーソル位置
> Point pt = e.Location;
Form や PictureBox の位置に関係なく、上記は常に
PictureBox の左上を原点とする座標系を返します。


> //ここら辺からよくわからなくなりました。
> Color LC = Color.FromArgb(LR, LG, LB);
この行は不要でしょう。

やりたいことは「画像上の色を取得」でしたが、ここで使われている
LR/LG/LB は、画像とは無関係の NumericUpDown 値ですし、
現時点では、NumericUpDown に入っている値も、画像上の色とは無関係だからです。


> //pxCに座標の色を代入します。
> Color pxC = bitmap.GetPixel(X, Y);
この方法で取得した Color は、画像上の色を表しますね。
しかし、そこに指定する X/Y 値が間違っています。

Bitmap に指定するべきは、スクリーン上の座標(Cursor.Location)ではなく、
画像上の座標(e.Location)です。


> //LCにpxCの色を代入します。
> LC = pxC;
かなり混乱が見られますね。(^^;

たとえば、
 int a = 123;
 int b = 456;
 a = b;
と書いた場合、123 は一切使われることなく、456 に上書きされますよね。

そのため上記は、
 int b = 456;
 int a = b;
と書いても同じ結果になります。


今回のコードもそれと同じで、
 Color LC = Color.FromArgb(LR, LG, LB);
 Color pxC = bitmap.GetPixel(X, Y);
 LC = pxC;
という部分で、「Color.FromArgb(LR, LG, LB);」が意味の無い処理に陥っています。



> パラメーターは正の値で、幅より小さい値を指定しなければなりません。
> パラメーター名:x
> というエラーがでてきます。こちらの解決策も教えていただけると助かります。
指定する座標系が間違っているからです。
Cursor.Location.X ではなく、画像上の値をセットする必要があります。

具体的には、e.X あるいは e.Location.X ですね。Y も同様。


また、PictureBox 上の余白部分(画像の無い部分)をクリックしたときも、
同様のエラーとなりますので、bitmap の範囲外の座標かどうかを
if 文で判定して、範囲外なら GetPixel しないようにしましょう。
引用返信 編集キー/
■68757 / inTopicNo.4)  Re[2]: C# 座標のRGBを取得にかんして。
□投稿者/ LAT (3回)-(2013/11/11(Mon) 23:44:22)
みなさんありがとうございました。
おかげで解決しました。
画像の表示に関してですが、
私が表示方法をZoomにしていたからでした。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -