最好用的取色器,顏色轉換器
阿新 • • 發佈:2019-01-02
你有沒有遇到過這樣的情況,瀏覽網頁或者瀏覽圖片或者工作中,突然看到一個顏色,特別想拿到這個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; }
效果如圖
最後放出連結