WinFrom 自定义颜色选择器,获取从控件上图片的颜色值,获取屏幕上某区域的颜色值

首次发布:2024-05-10 11:06


效果图

image.png

获取winfrom控件上图片的颜色值的核心代码

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }

    int x, y;
    private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
    {
        // 创建Bitmap对象加载图片
        Bitmap image = pictureBox1.Image as Bitmap;// new Bitmap(imagePath);
                                                   //int tempx = image.Width / pictureBox1.Width;
                                                   //int tempy = image.Height / pictureBox1.Height;
        x = e.X;
        y = e.Y;
        // 获取像素点的颜色
        Color pixelColor = image.GetPixel(x, y);

        // 可以通过pixelColor的R、G、B、A属性获取分别对应的红、绿、蓝、透明度值
        int red = pixelColor.R;
        int green = pixelColor.G;
        int blue = pixelColor.B;
        int alpha = pixelColor.A;

        label2.Text = "R:" + red + " G:" + green + " B:" + blue + " alpha:" + alpha + " x" + x + " y" + y;
        panel1.BackColor = Color.FromArgb(red, green, blue);
    }
    private void pictureBox2_MouseMove(object sender, MouseEventArgs e)
    {
            //lqwvje 2024-05-17
            //为了用户更好的体验,我们可以这样, 
            //if (Control.MouseButtons == MouseButtons.Left)
            //当鼠标按下左键时获取颜色值
            //当鼠标左键松开时,确认所获取的颜色值 把下面的点击事件改成 MouseUp 事件
            
        // 创建Bitmap对象加载图片
        Bitmap image = pictureBox2.Image as Bitmap;// new Bitmap(imagePath);
        int tempx = image.Width / pictureBox2.Width;
        int tempy = image.Height / pictureBox2.Height;
        x = e.X * tempx;//成比例的缩放
        y = e.Y * tempy;
        // 获取像素点的颜色
        Color pixelColor = image.GetPixel(x, y);

        // 可以通过pixelColor的R、G、B、A属性获取分别对应的红、绿、蓝、透明度值
        int red = pixelColor.R;
        int green = pixelColor.G;
        int blue = pixelColor.B;
        int alpha = pixelColor.A;

        label2.Text = "R:" + red + " G:" + green + " B:" + blue + " alpha:" + alpha + " x" + x + " y" + y;
        panel1.BackColor = Color.FromArgb(red, green, blue);
    }
    private void pictureBox1_Click(object sender, EventArgs e)
    {
        Bitmap image = pictureBox1.Image as Bitmap;// new Bitmap(imagePath);
        // 获取像素点的颜色
        Color pixelColor = image.GetPixel(x, y);

        // 可以通过pixelColor的R、G、B、A属性获取分别对应的红、绿、蓝、透明度值
        int red = pixelColor.R;
        int green = pixelColor.G;
        int blue = pixelColor.B;
        int alpha = pixelColor.A;

        label1.Text = "左击确认选中的颜色 " + "R:" + red + " G:" + green + " B:" + blue + " alpha:" + alpha + " x" + x + " y" + y;
        panel2.BackColor = Color.FromArgb(red, green, blue);
    }
    private void pictureBox2_Click(object sender, EventArgs e)
    {
        Bitmap image = pictureBox2.Image as Bitmap;// new Bitmap(imagePath);
        // 获取像素点的颜色
        Color pixelColor = image.GetPixel(x, y);

        // 可以通过pixelColor的R、G、B、A属性获取分别对应的红、绿、蓝、透明度值
        int red = pixelColor.R;
        int green = pixelColor.G;
        int blue = pixelColor.B;
        int alpha = pixelColor.A;

        label1.Text = "左击确认选中的颜色 " + "R:" + red + " G:" + green + " B:" + blue + " alpha:" + alpha + " x" + x + " y" + y;
        panel2.BackColor = Color.FromArgb(red, green, blue);
    }
}

获取屏幕上某区域的颜色值核心代码(注意电脑分辨率的比例)

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }
    [DllImport("gdi32.dll")]
    static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);

    [DllImport("gdi32.dll")]
    static public extern IntPtr CreateDC(string driverName, string deviceName, string output, IntPtr lpinitData);

    [DllImport("gdi32.dll")]
    static public extern bool DeleteDC(IntPtr DC);

    static public byte GetRValue(uint color)
    {
        return (byte)color;
    }

    static public byte GetGValue(uint color)
    {
        return ((byte)(((short)(color)) >> 8));
    }

    static public byte GetBValue(uint color)
    {
        return ((byte)((color) >> 16));
    }

    static public byte GetAValue(uint color)
    {
        return ((byte)((color) >> 24));
    }

    public Color GetColor(Point screenPoint)
    {
        IntPtr displayDC = CreateDC("DISPLAY", null, null, IntPtr.Zero);
        uint colorref = GetPixel(displayDC, screenPoint.X, screenPoint.Y);
        DeleteDC(displayDC);
        byte Red = GetRValue(colorref);
        byte Green = GetGValue(colorref);
        byte Blue = GetBValue(colorref);
        return Color.FromArgb(Red, Green, Blue);
    }



    private void timer1_Tick(object sender, EventArgs e)
    {
        Point pt = new Point(Control.MousePosition.X, Control.MousePosition.Y);
        Color cl = GetColor(pt);
        panel1.BackColor = cl;
        this.Text = cl.R + " " + cl.G + " " + cl.B;
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        timer1.Start();
    }
}

相关素材和源码下载地址 https://pan.baidu.com/s/1PTt1r7mCywGGac_pC0Bysw?pwd=d7tk 提取码: d7tk 

本文来自 www.luofenming.com