Solved

Get the Color based on  a cursor click

Posted on 2009-04-01
5
485 Views
Last Modified: 2012-05-06
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
Comment
Question by:SRabidou
  • 3
5 Comments
 
LVL 62

Accepted Solution

by:
Fernando Soto earned 500 total points
ID: 24044188
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
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 24045490
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
 
LVL 62

Expert Comment

by:Fernando Soto
ID: 24046601
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
 

Author Closing Comment

by:SRabidou
ID: 31565536
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
 
LVL 62

Expert Comment

by:Fernando Soto
ID: 24071608
Glad I was able to help.  ;=)
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

In order to hide the "ugly" records selectors (triangles) in the rowheaders, here are some suggestions. Microsoft doesn't have a direct method/property to do it. You can only hide the rowheader column. First solution, the easy way The first sol…
Introduction Although it is an old technology, serial ports are still being used by many hardware manufacturers. If you develop applications in C#, Microsoft .NET framework has SerialPort class to communicate with the serial ports.  I needed to…
This Micro Tutorial will teach you how to censor certain areas of your screen. The example in this video will show a little boy's face being blurred. This will be demonstrated using Adobe Premiere Pro CS6.
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

920 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now