|
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 しないようにしましょう。
|