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

  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(, '') + g.ToString("X").PadLeft(, '') +
b.ToString("X").PadLeft(, '');
} /// <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)) >> );
} /// <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 >> );
}

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

C#取色器的更多相关文章

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

    在使用powerpoint过程中常常发现一些功能我们很少用到,其实是自己不会用的原因,关于powerpoint取色器有什么用呢?接下来我们一起来学一下ppt取色器使用教程. powerpoint取色器 ...

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

    软件名称: TakeColor 屏幕取色器软件语言: 简体中文授权方式: 免费软件运行环境: Win8 / Win7 / Vista / WinXP软件大小: 210KB图片预览: 软件简介:使用方便 ...

  3. Win10手记-取色器ColorPicker的实现

    最近个人项目需要用到ColorPicker,但是适用于WinRT和Win10的基本没用,所以只能自己造轮子了. 平台环境 Windows 10 Visual Studio 2015 思路 确定需求后, ...

  4. ColorPix——到目前为止最好用的屏幕取色器

    分享一个颜色取色器网页.PPT.EXCEL配色不再烦恼 简单易用 大家做商业.企业报告的时候是不是经常遇到要调色的困扰呢?PPT.EXCEL等颜色选取会对报告有质的影响!!要更专业要更有美感!给大家分 ...

  5. Arava: 用 swing 写一个取色器

    备哥以前发我了一个小工具,TakeColor 取色器.来复刻一个吧. 分析一下:顶部是菜单,左侧框显示当前鼠标所在的颜色(下面显示当前坐标和颜色值,默认RGB),中间框显示鼠标周围区域,右侧显示取色的 ...

  6. iOS转场弹窗、网易云音乐动效、圆环取色器、Loading效果等源码

    iOS精选源码 view controller transition and popover (控制器转场和弹窗) UITableView头部悬停+UITableView侧滑嵌套 一行代码集成时间选择 ...

  7. Mac下好用的取色器 Sip

    总有很多东西,你只是望一眼就已经神魂颠倒.措施有这样的App做的真的是用心的很,养眼,触发你内心冲动的美感.先留下一个,备忘. 太精致了 操作简单,左上角的有心圆点击就可以在任何地方取色了,取色点会z ...

  8. html 颜色在线取色器

    推荐一个链接 还不错 http://www.atool.org/colorpicker.php

  9. WPF Adorner 简易图片取色器

    回答MSDN问题所写. 使用Adorner+附加属性 图片类(来自这位博主的博客) /// <summary> /// 用于获取位图像素的类 /// </summary> pu ...

随机推荐

  1. 安装lighttpd

    依赖包: zlib,pcre,cronolog,bzip2, 1: 将lighttpd的原码包.以土豆现用lighttpd配置文件为基础的lighttpd.conf文件.日志轮循工具cronolog  ...

  2. (转)IOS 的一些资源汇总

      UI界面类项目: Panoramagl —— 720全景展示 Panorama viewer library for iPhone, iPad and iPod touch MBProgressH ...

  3. lnmp集成环境Access Denied的问题

    在你的php.ini配置文件中,设置cgi.fix_pathinfo=1

  4. 在vue中使用animate.css

    animate.css是一款前端动画库,相似的有velocity-animate 用法: 首先 npm install animate.css --save 然后在vue文件的script中引入: i ...

  5. 高可用rabbitmq集群服务部署步骤

    消息队列是非常基础的关键服务,为保证公司队列服务的高可用及负载均衡,现通过如下方式实现: RabbitMQ Cluster + Queue HA + Haproxy + Keepalived 3台ra ...

  6. java中BigDecimal在金融行业中的使用

    1.引言 在java语言中,double和float用于二进制浮点型计算,无法得到精确的结果.而BigDecimal则用于精确的计算.不超过16位有效数字(最好是不超过13位)的科学和工程计算,可以使 ...

  7. NOIP模拟3

    期望得分:30+90+100=220 实际得分:30+0+10=40 T1智障错误:n*m是n行m列,硬是做成了m行n列 T2智障错误:读入三个数写了两个%d T3智障错误:数值相同不代表是同一个数 ...

  8. 51nod 1548 欧姆诺姆和糖果 (制约关系优化枚举)

    1548 欧姆诺姆和糖果 题目来源: CodeForces 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 一天,欧姆诺诺姆来到了朋友家里,他发现了 ...

  9. HDU 6158 笛卡尔定理 几何

    LINK 题意:一个大圆中内切两个圆,三个圆两两相切,再不断往上加新的相切圆,问加上的圆的面积和.具体切法看图 思路:笛卡尔定理: 若平面上四个半径为r1.r2.r3.r4的圆两两相切于不同点,则其半 ...

  10. asp.net mvc 站点优化

    基于上篇:IIS网站日志分析 现象 服务端:IIS 日志, #Fields: date time s-ip cs-method cs-uri-stem cs-uri-query s-port cs-u ...