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

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

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

クリックした場所の色情報の取得

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

■92941 / inTopicNo.1)  クリックした場所の色情報の取得
  
□投稿者/ C#初心者 (8回)-(2019/11/11(Mon) 14:42:40)

分類:[C#] 

いつもお世話になっております。

Windows formsでC#を用いて作成を行っています。

pictureboxをグラデーション(白と黒のグラデーション)で表示し、そのpicturebox内をクリックしたときにその部分の色のデータをrgb形式で取得して、numericUpDown1,2,3にそれぞれ表示させるものを作りたいと考えています。

グラデーションのやり方として
・https://dobon.net/vb/dotnet/graphics/lineargradientbrush.html
クリックしたところの色のデータ取得として
・https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11116345421

のサイトやほかに調べてやってみてはいるのですが(ほぼ丸写しの状態です)、データの取得がうまくいっていない状態です。
実行はできているので、何がおかしいのかアドバイスを頂けたらと思います。
よろしくお願いいたします。

以下が現在作成中のソースコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// 白黒カラー表示のため
using System.Drawing.Drawing2D;
using System.Runtime.InteropServices;

namespace 作成中
{

    public partial class Form1 : Form
    {
        public Form1()
        {

            InitializeComponent();
            // グラデーションの作成  この部分は実行できている
            //描画先とするImageオブジェクトの作成
            Bitmap canvas = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            //ImageオブジェクトのGraphicsオブジェクトの作成
            Graphics g = Graphics.FromImage(canvas);

            //縦に白から黒へのグラデーションのブラシを作成
            LinearGradientBrush gb = new LinearGradientBrush(
                    g.VisibleClipBounds,
                    Color.FromArgb(255, 255, 255),
                    Color.FromArgb(0,0,0),
                    LinearGradientMode.Vertical); 

            //四角を描く
            g.FillRectangle(gb, g.VisibleClipBounds);

            //リソースを解放する
            gb.Dispose();
            g.Dispose();

            //PictureBox1に表示する
            pictureBox1.Image = canvas;
        }
        // ここまで


        // 画像をクリックしたときにその部分のRGBの値を取得する処理 この部分が再現できない
        private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
           int X = e.Location.X;
           int Y = e.Location.Y;

          //マウスポインタを(0,0)へ
           Cursor.Position = new Point(0, 0);

           Bitmap bitmap = new Bitmap(pictureBox1.Image);

           //クリック時のカーソル位置
           Point pt = e.Location;

           Color LC = new Color();
           //pxCに座標の色を代入
           Color pxC = bitmap.GetPixel(X, Y);
           //LCにpxCの色を代入
           LC = pxC;


           int LR = LC.R;
           int LG = LC.G;
           int LB = LC.B;

           numericUpDown1.Value = LR;
           numericUpDown2.Value = LG;
           numericUpDown3.Value = LB;
        }
  }
}



引用返信 編集キー/
■92943 / inTopicNo.2)  Re[1]: クリックした場所の色情報の取得
□投稿者/ 魔界の仮面弁士 (2470回)-(2019/11/11(Mon) 14:58:44)
2019/11/12(Tue) 09:07:24 編集(投稿者)

No92941 (C#初心者 さん) に返信
> // 画像をクリックしたときにその部分のRGBの値を取得する処理 この部分が再現できない
> private void pictureBox1_MouseClick(object sender, MouseEventArgs e)

上記が呼び出されていない場合、イベントハンドラが割り当てられているかどうかを
確認してみてください。

呼び出されてはいるが、想定された座標が異なっている場合は
高DPI設定を変更してみて、改善されるかどうか確認してみてください。

https://qiita.com/felis_silv/items/efee4b1a397b0b95100a
https://blogs.msdn.microsoft.com/ttanaka/2014/07/16/dpihigh-dpi-1-dpi/
https://blogs.msdn.microsoft.com/ttanaka/2014/07/24/dpihigh-dpi-2-12398/
https://blogs.msdn.microsoft.com/ttanaka/2014/08/22/dpihigh-dpi-3-12503/


それと、全体的に無駄な処理が多いように見えます。


> int X = e.Location.X;
> int Y = e.Location.Y;
>
> //マウスポインタを(0,0)へ
> Cursor.Position = new Point(0, 0);
>
> Bitmap bitmap = new Bitmap(pictureBox1.Image);
>
> //クリック時のカーソル位置
> Point pt = e.Location;

カーソル位置を (0,0) に戻す必要があるかはさておき、
変数 Point pt を取得しているのは何故でしょう?

また、ここで pt から得られる座標が、どのような値であると期待されていますか?
前半の e.Location から取得した X, Y と同じ座標でしょうか。
それとも Cursor.Position で設定した (0, 0) の座標でしょうか。
あるいはそのいずれとも異なる座標が得られるとの認識でしょうか。




> Color LC = new Color();
> //pxCに座標の色を代入
> Color pxC = bitmap.GetPixel(X, Y);
> //LCにpxCの色を代入
> LC = pxC;
>
> int LR = LC.R;
> int LG = LC.G;
> int LB = LC.B;
>
> numericUpDown1.Value = LR;
> numericUpDown2.Value = LG;
> numericUpDown3.Value = LB;

途中の変数が余計に見えます。ここは単純に
 Color pxC = bitmap.GetPixel(X, Y);
 numericUpDown1.Value = pxC.R;
 numericUpDown2.Value = pxC.G;
 numericUpDown3.Value = pxC.B;
の 4 行だけでよいのでは。
引用返信 編集キー/
■92990 / inTopicNo.3)  Re[2]: クリックした場所の色情報の取得
□投稿者/ C#初心者 (9回)-(2019/11/12(Tue) 16:15:53)
No92943 (魔界の仮面弁士 さん) に返信
> 2019/11/12(Tue) 09:07:24 編集(投稿者)

ご返信ありがとうございます。
高DPIの設定など知らない部分もありますので、貼っていただいたurl等をもとにできるかどうか検証させていただきます。

また、ソースコードの内容もご指摘いただいた通り無駄な部分が多かったので簡潔にさせていただきました、ありがとうございます。



解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ