C#取色器

闲来无事,就写了一个取色器。原理其实很简单,只需要两步,

  1. 获取鼠标光标的位置,
  2. 获取当前鼠标光标的位置的RGB颜色值。

获取鼠标光标的位置:

System.Drawing.Point p = MousePosition;

获取指定坐标的RGB颜色值,这里我们需要用到1个WIN32的API函数:GetPixel。

GetPixel函数的作用是检索坐标点的像素的RGB颜色值,函数原型为COLORREF GetPixel(HDC hdc, int nXPos, int nYPos)

由于这个是系统提供的API函数,所以在C#中我们无法直接使用,我们需要把它"翻译"一下,以便让C#调用:

/// <summary>
/// 该函数检索指定坐标点的像素的RGB颜色值。
/// </summary>
/// <param name="hDC">设备环境句柄。</param>
/// <param name="nXPos">指定要检查的像素点的逻辑X轴坐标。</param>
/// <param name="nYPos">指定要检查的像素点的逻辑Y轴坐标。</param>
/// <returns>返回值是该象像点的RGB值。如果指定的像素点在当前剪辑区之外;那么返回值是CLR_INVALID。</returns>
[DllImport("gdi32")]
public static extern uint GetPixel(IntPtr hDC, int nXPos, int nYPos);

该函数的X,Y坐标我们已经获取到了,但是设备环境句柄hDC如何获取呢,这里我们又要用到一个WIN32的API函数:GetDC。

GetDC函数的作用是检索显示设备上下文环境的句柄,函数原型为HDC GetDC(HWND hWnd)

"翻译"如下:

/// <summary>
/// 该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,
/// 以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。
/// </summary>
/// <param name="hWnd">设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境。</param>
/// <returns>如果成功,返回指定窗口客户区的设备上下文环境;如果失败,返回值为Null。</returns>
[DllImport("user32")]
public static extern IntPtr GetDC(IntPtr hWnd);

由于是非托管代码,所以获取到的环境句柄,我们需要手动释放掉。这里又要用到一个API函数:ReleaseDC
ReleaseDC函数的作用是该函数释放设备上下文环境,函数原型为int ReleaseDC(HWND hWnd, HDC hdc)

"翻译"如下:

/// <summary>
/// 该函数释放设备上下文环境(DC)供其他应用程序使用。函数的效果与设备上下文环境类型有关。
/// 它只释放公用的和设备上下文环境,对于类或私有的则无效。
/// </summary>
/// <param name="hWnd">指向要释放的设备上下文环境所在的窗口的句柄。</param>
/// <param name="hDC">指向要释放的设备上下文环境的句柄。</param>
/// <returns>如果释放成功,则返回值为1;如果没有释放成功,则返回值为0。</returns>
[DllImport("user32")]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

接下来开始写代码了。

页面布局如下:

整体的代码也是很简单的。

using System;
using System.Drawing;
using System.Windows.Forms;
using JackyHelper;

namespace GetColor
{
    public partial class MainForm : Form
    {
        /// <summary>
        /// 显示设备上下文环境的句柄。
        /// </summary>
        private IntPtr _hdc = IntPtr.Zero;

        /// <summary>
        /// 指向窗口的句柄。
        /// </summary>
        private readonly IntPtr _hWnd = IntPtr.Zero;

        public MainForm()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            System.Drawing.Point p = MousePosition;

            tsslCursorPos.Text = string.Format("X:{0},Y:{1}", p.X, p.Y);

            uint color = Win32Helper.GetPixel(_hdc, p.X, p.Y);
            byte r = Win32Helper.GetRValue(color);
            byte g = Win32Helper.GetGValue(color);
            byte b = Win32Helper.GetBValue(color);

            txtR.Text = Convert.ToString(r);
            txtG.Text = Convert.ToString(g);
            txtB.Text = Convert.ToString(b);

            picColor.BackColor = Color.FromArgb(r, g, b);
            txtHexColor.Text = "#" + r.ToString("X").PadLeft(2, ‘0‘) + g.ToString("X").PadLeft(2, ‘0‘) +
                               b.ToString("X").PadLeft(2, ‘0‘);
        }

        /// <summary>
        /// 取色按钮按下
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGetColor_MouseDown(object sender, MouseEventArgs e)
        {
            _hdc = Win32Helper.GetDC(_hWnd);
            Cursor = Cursors.Cross;
            timer1.Enabled = true;
        }

        /// <summary>
        /// 取色按钮释放
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGetColor_MouseUp(object sender, MouseEventArgs e)
        {
            Win32Helper.ReleaseDC(_hWnd, _hdc);
            Cursor = Cursors.Default;
            timer1.Enabled = false;
            Text = "取色器 By Jacky QQ:773091523";
        }
    }
}
        /// <summary>
        /// 2014-12-5 21:43:51
        /// 获取一个RGB颜色值中的红色强度值。
        /// </summary>
        /// <param name="rgb">指定的RGB颜色值。</param>
        /// <returns></returns>
        public static byte GetRValue(uint rgb)
        {
            return (byte)rgb;
        }

        /// <summary>
        /// 2014-12-5 21:51:24
        /// 获取一个RGB颜色值中的绿色强度值。
        /// </summary>
        /// <param name="rgb">指定的RGB颜色值。</param>
        /// <returns></returns>
        public static byte GetGValue(uint rgb)
        {
            return (byte)(((ushort)(rgb)) >> 8);
        }

        /// <summary>
        /// 2014-12-5 21:52:37
        /// 获取一个RGB颜色值中的蓝色强度值。
        /// </summary>
        /// <param name="rgb">指定的RGB颜色值。</param>
        /// <returns></returns>
        public static byte GetBValue(uint rgb)
        {
            return (byte)(rgb >> 16);
        }

不足之处,还望各位大神指正,不胜感激。

时间: 2024-10-24 05:23:55

C#取色器的相关文章

TakeColor 屏幕取色器 8.0 中文绿色版

软件名称: TakeColor 屏幕取色器软件语言: 简体中文授权方式: 免费软件运行环境: Win8 / Win7 / Vista / WinXP软件大小: 210KB图片预览: 软件简介:使用方便的屏幕取色器,别的取色工具总是用鼠标点击来取色的,这个工具可以直接用alt+c快键捷来完成屏幕取色 软件下载页面:http://www.bkill.com/download/23831.html 软件下载地址:电信下载 联通下载

Win10手记-取色器ColorPicker的实现

最近个人项目需要用到ColorPicker,但是适用于WinRT和Win10的基本没用,所以只能自己造轮子了. 平台环境 Windows 10 Visual Studio 2015 思路 确定需求后,我查找了各方信息,发现PhotoShop的ColorPicker最符合我的需求,这里我们实现的仿PhotoShop HSB取色器,样式如下图. 确定目标后,则需要研究具体的调色原理了.我们都知道,程序使用的一般都是RGB颜色,而这里使用的则是HSB颜色.顾名思义,HSB分别是指色相(Hue)纯度(S

给大家介绍一个java取色器工具

Java取色器中调用了robot方法的getPixelColor方法下面我们来看robot类中方法的具体实现如下 getPixelColor public Color getPixelColor(int x, int y) 返回给定屏幕坐标处的像素颜色. 参数: x - 像素的 X 位置 y - 像素的 Y 位置 返回: 像素的颜色 取色器通过x,y坐标返回颜色值 我通可以通过定义鼠标监听来获得鼠标的x,y坐标然后来获得要取的位置的颜色值 具体例子如下 public void mouseClic

powerpoint取色器有什么用|ppt取色器使用教程

在使用powerpoint过程中常常发现一些功能我们很少用到,其实是自己不会用的原因,关于powerpoint取色器有什么用呢?接下来我们一起来学一下ppt取色器使用教程. powerpoint取色器有什么用 ppt取色器使用教程 ppt取色器简介 想要自己的幻灯片跟图片的颜色吻合那就要用到取色器这个功能了,但是取色器的运用也是有一定的技巧的.辛苦地尝试精确匹配形状和图片的颜色,配合PowerPoint2013演示文稿的其他部分,为您的幻灯片提供富有凝聚力的外观,您是否已经厌倦?使用 Power

jsColor取色器插件的基本用法

最近项目中用到了一款取色器插件,非常简洁.实用. 官网地址:http://jscolor.com/ 使用方法:1.引入js文件. <script type="text/javascript" src="jscolor/jscolor.js"></script> 2.设置文本框class并设置默认显示颜色. <input class="color" type="text" value="f

使用谷歌浏览器取色器取色

首先需要调到开发者模式,然后再点击图下的标识. 接着变成图标,点击就可以出现取色器. 原文地址:https://www.cnblogs.com/apolloren/p/12233060.html

win10下, TakeColor取色器错位 指针偏移问题 解决方法

当win10的屏幕缩放比例不是100%时,屏幕取色器ColorPix指针会发生偏移 解决: 1.右击 —> 属性 —> 兼容性 2.勾选"高DPI缩放替代" 原文地址:https://www.cnblogs.com/FengZeng666/p/12539762.html

Mac下好用的取色器 Sip

总有很多东西,你只是望一眼就已经神魂颠倒.措施有这样的App做的真的是用心的很,养眼,触发你内心冲动的美感.先留下一个,备忘. 太精致了 操作简单,左上角的有心圆点击就可以在任何地方取色了,取色点会zoom in. 右上角彩色的有心圆,就是系统的颜色板喽.每次取色完成会自动添加到刘表中,并有颜色的名字显示(不只是颜色code),还有方块颜色.这个设计的比例都很漂亮. 点击大于号还可以设置颜色代码显示的格式,便于使用,CMYK,RGB(A),HSL(A)等常用格式 设置界面也很美. 综上所述,贴心

我常用的在线取色器

颜色明淡 http://www.colorschemer.com/online.html 2.http://tool.cc/color/