C#取色器

摘要:
闲来无事,就写了一个取色器。原理其实很简单,只需要两步,获取鼠标光标的位置,获取当前鼠标光标的位置的RGB颜色值。GetPixel函数的作用是检索坐标点的像素的RGB颜色值,函数原型为COLORREFGetPixel由于这个是系统提供的API函数,所以在C#中我们无法直接使用,我们需要把它"翻译"一下,以便让C#调用://////该函数检索指定坐标点的像素的RGB颜色值。[DllImport]publicstaticexternIntPtrGetDC;由于是非托管代码,所以获取到的环境句柄,我们需要手动释放掉。

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

  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);

接下来开始写代码了。

页面布局如下:

C#取色器第1张

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

usingSystem;
usingSystem.Drawing;
usingSystem.Windows.Forms;
usingJackyHelper;

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

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

        publicMainForm()
        {
            InitializeComponent();
        }

        private void timer1_Tick(objectsender, 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(objectsender, 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(objectsender, 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(uintrgb)
        {
            return (byte)rgb;
        }

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

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

免责声明:文章转载自《C#取色器》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇c语言中typeof关键字Spring缓存注解@Cache使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

计算机颜色格式( 8位 16位 24位 32位色)

常见的颜色有 8位 16位 24位 32位色,其中24位及以上称为真彩,是PC上最常用的颜色,其他基本用于嵌入式系统或一些工控领域,详情可查阅一下表格: Bit-深度    色彩数1           2 (monochrome)2           4 (CGA)4           16 (EGA)8           256 (VGA)16 ...

【Java虚拟机11】线程上下文类加载器

前言 目前学习到的类加载的知识,都是基于【双亲委托机制】的。那么JDK难道就没有提供一种打破双亲委托机制的类加载机制吗?答案是否定的。JDK为我们提供了一种打破双亲委托模型的机制:线程上下文类加载器。 1.引出【线程上下文类加载器】 我们来复习一下JDBC执行SQL的代码【画外音:感觉回到了大学自学Java的时候】: Connection conn = D...

Java之nio MappedByteBuffer的资源释放问题

使用nio的MappedByteBuffer映射内存, 在最后执行File.delete()方法的时候, 返回false,  即文件没有被删除. 原因是MappedByteBuffer在内存中也会创建文件的一个句柄, 所以必须先释放MapppedByteBuffer之后才能执行文件的删除操作.如果使用SUN的JDK, 可以使用: public static...

Spring Boot中集成Spring Security 专题

  check to see if spring security is applied that the appropriate resources are permitted: @Configuration public class WebSecurityConfiguration extends WebSecurityConfigurer...

Qt Linguist介绍

简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具。发布者、翻译者和开发者可以使用这款工具来完成他们的任务。 发布者:承担了全面发布应用程序的责任。通常,他们协调开发者和翻译者的工作,可以使用lupdate工具同步源代码,进行翻译,使用lrelease同步工具为发布应用程序创建运行时使用的翻译文件。 翻译者:可以使用Qt Li...

reactor设计模式

reactor设计模式,是一种基于事件驱动的设计模式。 《Pattern-Oriented Software Architecture, Volume 2》 对这个模式做了详细的讲解。 这个模式的结构图如下: 图中的handle对应的是操作系统提供的句柄,例如I/O句柄,Event_Handler类持有这些句柄, reactor类内部提供一个事件循环:h...