Solved

Get the Color based on  a cursor click

Posted on 2009-04-01
5
484 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

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Article by: Ivo
C# And Nullable Types Since 2.0 C# has Nullable(T) Generic Structure. The idea behind is to allow value type objects to have null values just like reference types have. This concerns scenarios where not all data sources have values (like a databa…
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

762 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

20 Experts available now in Live!

Get 1:1 Help Now