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

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

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

Re[5]: pictureboxをクリックした部分のRGB値を取得したい


(過去ログ 134 を表示中)

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

■79100 / inTopicNo.1)  pictureboxをクリックした部分のRGB値を取得したい
  
□投稿者/ かな (1回)-(2016/03/07(Mon) 20:43:11)

分類:[C#] 

pictureboxをクリックしたときにその部分ののRGB値を取得するプログラムを作っていますが上手くいきません。
pictureboxのbackcolorを黒にしてもRGB値がおかしな数値になります。

どうしたらいいのでしょうか?
ソースコードを以下に貼ります。
よろしくお願いします。

namespace getRGB
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            Bitmap bitmap = new Bitmap(1, 1);
            Graphics g = Graphics.FromImage(bitmap);
            g.CopyFromScreen(new Point(e.Location.X, e.Location.Y), new Point(0, 0), new Size(1, 1));
            Color color = bitmap.GetPixel(0, 0);
            Console.WriteLine("R:" + color.R + "G:" + color.G + "B:" + color.B);
        }
    }
}

引用返信 編集キー/
■79101 / inTopicNo.2)  Re[1]: pictureboxをクリックした部分のRGB値を取得したい
□投稿者/ 魔界の仮面弁士 (664回)-(2016/03/07(Mon) 21:24:30)
No79100 (かな さん) に返信
> pictureboxをクリックしたときに
テスト段階では、MouseMove を使うと分かりやすいかも。


> new Point(e.Location.X, e.Location.Y)
「new Point(e.Location.X, e.Location.Y)」は
「e.Location」と同義ですよ。


> Bitmap bitmap = new Bitmap(1, 1);
> Graphics g = Graphics.FromImage(bitmap);
オブジェクトの破棄を忘れています。
using しましょう。


> g.CopyFromScreen(new Point(e.Location.X, e.Location.Y), new Point(0, 0), new Size(1, 1));
PictureBox の左上を、デスクトップの左上に見立てて、
相対座標指定で、縦横 1 ドットだけの転写を行っているのですね。


> pictureboxのbackcolorを黒にしても
PictureBox の (15, 15) の座標をクリックした場合、
デスクトップの (15, 15) の色を調べるのですよね?

であれば、PictureBox の色は関係ないかと。


> RGB値がおかしな数値になります。
期待している RGB 値と、
実際の RGB 値はいくつですか?




// PictureBox の (x, y) の位置にカーソルを当てると、
// (PictureBox ではなく)スクリーンの (x, y) の色を取得する
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
 using (Bitmap bitmap = new Bitmap(1, 1))
 using (Graphics g = Graphics.FromImage(bitmap))
 {
  g.CopyFromScreen(e.Location, new Point(0, 0), new Size(1, 1));
  Color color = bitmap.GetPixel(0, 0);
  pictureBox1.BackColor = color;
  Text = string.Format("{0} => R:{1}, G:{2}, B:{3}", e.Location, color.R, color.G, color.B);
 }
}


ちなみに、上記で
 g.CopyFromScreen(Cursor.Position, new Point(0, 0), new Size(1, 1));
に変更した場合、「PictureBox 上で MouseDown したままドラッグ」すると、
ドラッグ中の現在座標にある色情報が転写されます。
引用返信 編集キー/
■79103 / inTopicNo.3)  Re[2]: pictureboxをクリックした部分のRGB値を取得したい
□投稿者/ かな (2回)-(2016/03/07(Mon) 22:41:39)
No79101 (魔界の仮面弁士 さん) に返信

ご返信ありがとうございます。

やりたかったことはデスクトップの色情報ではなくて、picturebox内の色を取得するプログラムです。

pictureboxの、X:50 Y:50の位置の赤色が描画されているとします。
その部分をクリックすればR:255 G:0 B:0を取得する。

もしよろしければサンプルプログラムを頂ければ紹介いただきたいです。


引用返信 編集キー/
■79105 / inTopicNo.4)  Re[3]: pictureboxをクリックした部分のRGB値を取得したい
□投稿者/ 魔界の仮面弁士 (665回)-(2016/03/08(Tue) 02:57:49)
No79103 (かな さん) に返信
> やりたかったことはデスクトップの色情報ではなくて、picturebox内の色を取得するプログラムです。
であれば、マウスカーソルの位置をスクリーン座標で指定する必要があります。

スクリーン座標を得るには、
 Point pos = pictureBox1.PointToScreen(e.Location);
もしくは
 Point pos = Cursor.Position;
とします。後者の方が簡単ですね。


そのように指定してもずれるようであれば、お使いの PC が
高dpiモニタ設定になっている可能性があります。その場合は
プロジェクトに「アプリケーション マニフェスト」を追加し、
dpiAware を true にしてみてください。

http://blogs.msdn.com/b/ttanaka/archive/2014/08/22/dpi-high-dpi-3-dpi.aspx
引用返信 編集キー/
■79146 / inTopicNo.5)  Re[4]: pictureboxをクリックした部分のRGB値を取得したい
□投稿者/ かな (3回)-(2016/03/10(Thu) 22:51:09)
No79105 (魔界の仮面弁士 さん) に返信

ありがとうございます。
目的の動作ができました。
解決済み
引用返信 編集キー/
■79187 / inTopicNo.6)  Re[5]: pictureboxをクリックした部分のRGB値を取得したい
□投稿者/ Jitta (185回)-(2016/03/13(Sun) 20:54:18)
No79146 (かな さん) に返信
> ■No79105 (魔界の仮面弁士 さん) に返信
>
> ありがとうございます。
> 目的の動作ができました。

> やりたかったことはデスクトップの色情報ではなくて、picturebox内の色を取得するプログラムです。
ほんとうかなぁ?
本当にしなければならないことは、PictureBox に表示しているイメージの色を取得することなんじゃないかなぁ?
PictureBox より小さいイメージを表示させて、PicturBox の内側だけど、イメージの外側をクリックしたら、どうなるの?
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -