最好用的取色器,颜色转换器

  你有没有遇到过这样的情况,浏览网页或者浏览图片或者工作中,突然看到一个颜色,特别想拿到这个RGB颜色或者16进制颜色。(然后解决的方法就是截图存下来,拿到PS里去查看颜色。)

  你还有没有遇到过这样的情况,只有一个RGB颜色或者16进制颜色,却无法转换。(然后解决的方法就是截图存下来,拿到PS里去转换颜色。)

  所以今天花了点时间做了一款小工具。虽然很小但却很好用,大小仅有39kb。但是代码却很强大,甚至会被杀软误报(由于使用了键盘钩子,完全无毒请放心使用)。

(一)颜色拾取

  引用系统API

        /// <summary>
        /// 获取指定窗口的设备场景
        /// </summary>
        /// <param name="hwnd">将获取其设备场景的窗口的句柄。若为0,则要获取整个屏幕的DC</param>
        /// <returns>指定窗口的设备场景句柄,出错则为0</returns>
        [DllImport("user32.dll")]
        public static extern IntPtr GetDC(IntPtr hwnd);

        /// <summary>
        /// 释放由调用GetDC函数获取的指定设备场景
        /// </summary>
        /// <param name="hwnd">要释放的设备场景相关的窗口句柄</param>
        /// <param name="hdc">要释放的设备场景句柄</param>
        /// <returns>执行成功为1,否则为0</returns>
        [DllImport("user32.dll")]
        public static extern Int32 ReleaseDC(IntPtr hwnd, IntPtr hdc);

        /// <summary>
        /// 在指定的设备场景中取得一个像素的RGB值
        /// </summary>
        /// <param name="hdc">一个设备场景的句柄</param>
        /// <param name="nXPos">逻辑坐标中要检查的横坐标</param>
        /// <param name="nYPos">逻辑坐标中要检查的纵坐标</param>
        /// <returns>指定点的颜色</returns>
        [DllImport("gdi32.dll")]
        public static extern uint GetPixel(IntPtr hdc, int nXPos, int nYPos);

  不知道为何用下面的引用就是获取不到颜色,一直返回-1

private static extern int GetPixel(IntPtr hdc, Point p);

  调用方法如下

     public Color GetColor(int x, int y)
        {
            IntPtr hdc = GetDC(IntPtr.Zero); uint pixel = GetPixel(hdc, x, y);
            ReleaseDC(IntPtr.Zero, hdc);
            Color color = Color.FromArgb((int)(pixel & 0x000000FF), (int)(pixel & 0x0000FF00) >> 8, (int)(pixel & 0x00FF0000) >> 16);
            return color;
        }

效果如图

  由于颜色拾取是根据鼠标位置来拾取的,那怎么把颜色锁住呢?这就需要键盘钩子了,需要监听鼠标按键,光程序内部的MouseClick是不行的,当窗体没有激活的时候也需要获取颜色。所以用到了键盘钩子,键盘钩子代码量太大就不发了,有兴趣的可以联系我。键盘钩子会被部分杀软报毒,原因是它可以监视鼠标和键盘,打密码也会被监视,这个就有点恐怖了。

扫描二维码关注公众号,回复: 4749140 查看本文章

(二)颜色转换

  这个功能的代码就相对简单了。不管怎么转换只要能拿到Color就可以互相转换。代码如下:

  RGB转Color

        try
            {
                string rgbstr = txt_rbg1.Text.Replace(",", ",");
                int[] list = Array.ConvertAll<string, int>(rgbstr.Split(','), x => Convert.ToInt32(x));
                if (list.Length == 3)
                {
                    Color c = Color.FromArgb(list[0], list[1], list[2]);
                    JConvert(c);
                }
            }
            catch
            {
                return;  

16进制颜色转Color

        try
            {
                Color c = System.Drawing.ColorTranslator.FromHtml(txt_color161.Text);
                JConvert(c);
            }
            catch
            {
                return;
            }    

效果如图

最后放出链接

https://pan.baidu.com/s/1aiNgsIDnKLTx8nq1XtvOBA

猜你喜欢

转载自www.cnblogs.com/jy8888/p/10195864.html