基于C#制作一個顏色拾取器
更新時間:2024年01月30日 15:18:03 作者:lingxiao16888
這篇文章主要為大家詳細介紹了如何基于C#制作一個顏色拾取器,可以獲取屏幕上任意位置像素的色值,文中的示例代碼講解詳細,有需要的小伙伴可以了解下
1.目的
獲取屏幕上任意位置像素的色值。
2.知識點
熱鍵的注冊與注銷。
/// <summary> /// 熱鍵注冊 /// </summary> /// <param name="hWnd">要定義熱鍵的窗口的句柄 </param> /// <param name="id">定義熱鍵ID(不能與其它ID重復) </param> /// <param name="fsModifiers">標識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時才會生效 </param> /// <param name="vk">定義熱鍵的內容 </param> /// <returns>如果函數執(zhí)行成功,返回值不為0。如果函數執(zhí)行失敗,返回值為0。要得到擴展錯誤信息,調用GetLastError。</returns> [DllImport("user32.dll", SetLastError = true)] public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk); /// <summary> /// 熱鍵注銷 /// </summary> /// <param name="hWnd">要取消熱鍵的窗口的句柄 </param> /// <param name="id">要取消熱鍵的ID </param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)] public static extern bool UnregisterHotKey(IntPtr hWnd, int id);
顏色的獲取。
/// <summary> /// 在一個指定設備場景中獲取一個像素的RGB值 /// </summary> /// <param name="hDC">設備場景的句柄</param> /// <param name="XPos">邏輯坐標中要檢查點的X坐標</param> /// <param name="YPos">邏輯坐標中要檢查點的Y坐標</param> /// <returns>返回一個32位包含ARGB的UInt</returns> [DllImport("gdi32.dll")] static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos);
獲取的顏色值(32位Uint 數據類型),A ,R,G,B分布如下:
與常規(guī)A,R,G,B排序有所區(qū)別,而且獲取的Alpha部分始終為0。
3.效果展示
4.代碼
public partial class Form1 : Form { public Form1() { InitializeComponent(); } Timer t = new Timer() { Interval = 100 }; IntPtr displayHwd; private void Form1_Load(object sender, EventArgs e) { APIHelper.RegisterHotKey(this.Handle, 81, KeyModifiers.Shift, Keys.C); this.TopMost = checkBox1.Checked; t.Tick += T_Tick; } private void Form1_FormClosing(object sender, FormClosingEventArgs e) { APIHelper.UnregisterHotKey(this.Handle, 81); } /// <summary> /// 獲取color從左至右第4個byte作為Blue值 /// </summary> /// <param name="color"></param> /// <returns></returns> byte GetBlue(uint color) { return (byte)(color>>16); } byte GetGreen(uint color) { //向右移動8位 return (byte)(color >> 8); } byte GetRed(uint color) { return (byte)(color); } byte GetAlpha(uint color) { return (byte)(color >> 24); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { this.TopMost = checkBox1.Checked; } private void btnExit_Click(object sender, EventArgs e) { Application.Exit(); } private void btnStart_Click(object sender, EventArgs e) { if (btnStart.Text == "開始") { t.Start(); btnStart.BackColor = Color.LightGreen; btnStart.Text = "停止"; displayHwd= APIHelper.CreateDC("DISPLAY", null, null, IntPtr.Zero); } else { btnStart.Text = "開始"; t.Stop(); btnStart.BackColor = SystemColors.Control; APIHelper.DeleteDC(displayHwd); } } protected override void WndProc(ref Message m) { //WM_HOTKEY=0x0312,熱鍵關聯的消息ID const int WM_HOTKEY = 0x0312; //按快捷鍵 switch (m.Msg) { case WM_HOTKEY: switch (m.WParam.ToInt32()) { case 81: //按下的是Shift+C Clipboard.SetText(txtColor.Text); break; } break; } base.WndProc(ref m); } List<string> list = new List<string>(); private void T_Tick(object sender, EventArgs e) { Point mousePoint= Control.MousePosition; txtPoint.Text = $"X:{mousePoint.X},Y:{mousePoint.Y}"; if(Control.MouseButtons== MouseButtons.Left) { uint colorVal = APIHelper.GetPixel(displayHwd, mousePoint.X, mousePoint.Y); list.Clear(); byte[] bytes = BitConverter.GetBytes(colorVal); BitArray array = new BitArray(bytes); foreach (bool bit in array) { if (bit) { list.Add("1"); } else { list.Add("0"); } } list.Reverse(); txtMonitor.Text = string.Join(" ", list); byte red = GetRed(colorVal); byte green = GetGreen(colorVal); byte blue = GetBlue(colorVal); byte alpha = GetAlpha(colorVal); panel1.BackColor = Color.FromArgb( red, green, blue); txtColor.Text = ColorTranslator.ToHtml(panel1.BackColor).ToString(); txtRGB.Text = $"{red},{green},{blue}"; btnStart.Text = "開始"; t.Stop(); btnStart.BackColor = SystemColors.Control; APIHelper.DeleteDC(displayHwd); } } } [Flags()] public enum KeyModifiers { None = 0, Alt = 1, Ctrl = 2, Shift = 4, WindowsKey = 8 } class APIHelper { /// <summary> /// 在一個指定設備場景中獲取一個像素的RGB值 /// </summary> /// <param name="hDC">設備場景的句柄</param> /// <param name="XPos">邏輯坐標中要檢查點的X坐標</param> /// <param name="YPos">邏輯坐標中要檢查點的Y坐標</param> /// <returns>返回一個32位包含ARGB的UInt</returns> [DllImport("gdi32.dll")] static public extern uint GetPixel(IntPtr hDC, int XPos, int YPos); /// <summary> /// 為專門設備創(chuàng)建設備場景 /// </summary> /// <param name="driverName">如果此參數為DISPLAY則代表整個屏幕的設備場景,如果為WINSPOOL則訪問打印機驅動</param> /// <param name="deviceName">所用專門設備的名稱</param> /// <param name="output">用null給該參數</param> /// <param name="lpinitData">DEVMODE,該結構保存初始值</param> /// <returns>設備場景的句柄</returns> [DllImport("gdi32.dll")] static public extern IntPtr CreateDC(string driverName, string deviceName, string output, IntPtr lpinitData); /// <summary> /// 在一個指定設備場景中獲取一個像素的RGB值 /// </summary> /// <param name="DC">設備場景的句柄</param> /// <returns></returns> [DllImport("gdi32.dll")] static public extern bool DeleteDC(IntPtr DC); /// <summary> /// 熱鍵注冊 /// </summary> /// <param name="hWnd">要定義熱鍵的窗口的句柄 </param> /// <param name="id">定義熱鍵ID(不能與其它ID重復) </param> /// <param name="fsModifiers">標識熱鍵是否在按Alt、Ctrl、Shift、Windows等鍵時才會生效 </param> /// <param name="vk">定義熱鍵的內容 </param> /// <returns>如果函數執(zhí)行成功,返回值不為0。如果函數執(zhí)行失敗,返回值為0。要得到擴展錯誤信息,調用GetLastError。</returns> [DllImport("user32.dll", SetLastError = true)] public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyModifiers fsModifiers, Keys vk); /// <summary> /// 熱鍵注銷 /// </summary> /// <param name="hWnd">要取消熱鍵的窗口的句柄 </param> /// <param name="id">要取消熱鍵的ID </param> /// <returns></returns> [DllImport("user32.dll", SetLastError = true)] public static extern bool UnregisterHotKey(IntPtr hWnd, int id); }
到此這篇關于基于C#制作一個顏色拾取器的文章就介紹到這了,更多相關C#顏色拾取器內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!