1. 程式人生 > >最好用的取色器,顏色轉換器

最好用的取色器,顏色轉換器

  你有沒有遇到過這樣的情況,瀏覽網頁或者瀏覽圖片或者工作中,突然看到一個顏色,特別想拿到這個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是不行的,當窗體沒有啟用的時候也需要獲取顏色。所以用到了鍵盤鉤子,鍵盤鉤子程式碼量太大就不發了,有興趣的可以聯絡我。鍵盤鉤子會被部分殺軟報毒,原因是它可以監視滑鼠和鍵盤,打密碼也會被監視,這個就有點恐怖了。

(二)顏色轉換

  這個功能的程式碼就相對簡單了。不管怎麼轉換隻要能拿到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