• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 492
  • Last Modified:

Get the Color based on a cursor click

Is there a way to get the color that the mouse was pointing at when clicked.
I have a picturebox with a background image in it. I wish to know the color of the spot at which the cursor was clicked with the image.

Thanks,
0
SRabidou
Asked:
SRabidou
  • 3
1 Solution
 
Fernando SotoRetiredCommented:
Hi SRabidou;

When you create the Image for the pictureBox create it as a Bitmap. This will allow you to use the Bitmap.GetPixel method to get the color under the cursor when clicked. See code snippet below.

Fernando
private void Form1_Load(object sender, EventArgs e)
{
    // Load the Image into a Bitmap object
    Bitmap bmap = new Bitmap(Image.FromFile(@"C:\Temp\imageDownloaded.jpg"));
    // Assign the Bitmap to the PictureBox.Image property
    pictureBox1.Image = bmap;
}
 
private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
{
    // Cast PictureBox.Image property to Bitmap and get the color 
    // of the pixel from the GetPixel method of the Bitmap
    Color color = ((Bitmap)pictureBox1.Image).GetPixel(e.X, e.Y);
}

Open in new window

0
 
Mike TomlinsonMiddle School Assistant TeacherCommented:
That may not work properly if the image is being STRETCHED as the coords in the form will not match the coords in the bitmap...

You can use the GetPixel() API, though, to get the color directly off the SCREEN:
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        [StructLayout(LayoutKind.Sequential)]
        public struct COLORRGBA
        {
            public byte r;
            public byte g;
            public byte b;
            public byte a;
        }
 
        [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
        public static extern IntPtr GetDesktopWindow();
        [DllImport("user32.dll")]
        static extern IntPtr GetWindowDC(IntPtr ptr);
        [DllImport("gdi32.dll")]
        static extern COLORRGBA GetPixel(IntPtr hdc, int x, int y);
        [DllImport("user32.dll")]
        static extern int ReleaseDC(IntPtr hwnd, IntPtr hdc);
 
        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            IntPtr deskWnd = GetDesktopWindow();
            IntPtr deskHDC = GetWindowDC(deskWnd);
            COLORRGBA c = GetPixel(deskHDC, Cursor.Position.X, Cursor.Position.Y);
            ReleaseDC(deskWnd, deskHDC);
            label1.Text = Color.FromArgb(c.a,c.r,c.g,c.b).ToString();
        }
 
    }

Open in new window

0
 
Fernando SotoRetiredCommented:
Idle_Mind is correct if the picturebox SizeMode is not set to Normal it will give wrong values or throw an exception with the X or Y values fall outsize the image size.
0
 
SRabidouAuthor Commented:
Great solution. I'm not expecting to have the "streching issue" that Idle Mind referred to but that soultion was well done as well but a little difficult to understand.
0
 
Fernando SotoRetiredCommented:
Glad I was able to help.  ;=)
0

Featured Post

2018 Annual Membership Survey

Here at Experts Exchange, we strive to give members the best experience. Help us improve the site by taking this survey today! (Bonus: Be entered to win a great tech prize for participating!)

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now