日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

C#取色器

發(fā)布時(shí)間:2023/12/10 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#取色器 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
閑來無事,就寫了一個(gè)取色器。原理其實(shí)很簡單,只需要兩步,

??? 獲取鼠標(biāo)光標(biāo)的位置,
??? 獲取當(dāng)前鼠標(biāo)光標(biāo)的位置的RGB顏色值。

獲取鼠標(biāo)光標(biāo)的位置:

System.Drawing.Point p = MousePosition;


獲取指定坐標(biāo)的RGB顏色值,這里我們需要用到1個(gè)WIN32的API函數(shù):GetPixel。

GetPixel函數(shù)的作用是檢索坐標(biāo)點(diǎn)的像素的RGB顏色值,函數(shù)原型為COLORREF GetPixel(HDC hdc, int nXPos, int nYPos)

由于這個(gè)是系統(tǒng)提供的API函數(shù),所以在C#中我們無法直接使用,我們需要把它"翻譯"一下,以便讓C#調(diào)用:
復(fù)制代碼

/// <summary>
/// 該函數(shù)檢索指定坐標(biāo)點(diǎn)的像素的RGB顏色值。
/// </summary>
/// <param name="hDC">設(shè)備環(huán)境句柄。</param>
/// <param name="nXPos">指定要檢查的像素點(diǎn)的邏輯X軸坐標(biāo)。</param>
/// <param name="nYPos">指定要檢查的像素點(diǎn)的邏輯Y軸坐標(biāo)。</param>
/// <returns>返回值是該象像點(diǎn)的RGB值。如果指定的像素點(diǎn)在當(dāng)前剪輯區(qū)之外;那么返回值是CLR_INVALID。</returns>
[DllImport("gdi32")]
public static extern uint GetPixel(IntPtr hDC, int nXPos, int nYPos);

復(fù)制代碼

該函數(shù)的X,Y坐標(biāo)我們已經(jīng)獲取到了,但是設(shè)備環(huán)境句柄hDC如何獲取呢,這里我們又要用到一個(gè)WIN32的API函數(shù):GetDC。

GetDC函數(shù)的作用是檢索顯示設(shè)備上下文環(huán)境的句柄,函數(shù)原型為HDC GetDC(HWND hWnd)

"翻譯"如下:
復(fù)制代碼

/// <summary>
/// 該函數(shù)檢索一指定窗口的客戶區(qū)域或整個(gè)屏幕的顯示設(shè)備上下文環(huán)境的句柄,
/// 以后可以在GDI函數(shù)中使用該句柄來在設(shè)備上下文環(huán)境中繪圖。
/// </summary>
/// <param name="hWnd">設(shè)備上下文環(huán)境被檢索的窗口的句柄,如果該值為NULL,GetDC則檢索整個(gè)屏幕的設(shè)備上下文環(huán)境。</param>
/// <returns>如果成功,返回指定窗口客戶區(qū)的設(shè)備上下文環(huán)境;如果失敗,返回值為Null。</returns>
[DllImport("user32")]
public static extern IntPtr GetDC(IntPtr hWnd);

復(fù)制代碼

由于是非托管代碼,所以獲取到的環(huán)境句柄,我們需要手動(dòng)釋放掉。這里又要用到一個(gè)API函數(shù):ReleaseDC
ReleaseDC函數(shù)的作用是該函數(shù)釋放設(shè)備上下文環(huán)境,函數(shù)原型為int ReleaseDC(HWND hWnd, HDC hdc)

"翻譯"如下:
復(fù)制代碼

/// <summary>
/// 該函數(shù)釋放設(shè)備上下文環(huán)境(DC)供其他應(yīng)用程序使用。函數(shù)的效果與設(shè)備上下文環(huán)境類型有關(guān)。
/// 它只釋放公用的和設(shè)備上下文環(huán)境,對(duì)于類或私有的則無效。
/// </summary>
/// <param name="hWnd">指向要釋放的設(shè)備上下文環(huán)境所在的窗口的句柄。</param>
/// <param name="hDC">指向要釋放的設(shè)備上下文環(huán)境的句柄。</param>
/// <returns>如果釋放成功,則返回值為1;如果沒有釋放成功,則返回值為0。</returns>
[DllImport("user32")]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

復(fù)制代碼

接下來開始寫代碼了。

頁面布局如下:

整體的代碼也是很簡單的。
復(fù)制代碼

using System;
using System.Drawing;
using System.Windows.Forms;
using JackyHelper;

namespace GetColor
{
??? public partial class MainForm : Form
??? {
??????? /// <summary>
??????? /// 顯示設(shè)備上下文環(huán)境的句柄。
??????? /// </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(2, '0') + g.ToString("X").PadLeft(2, '0') +
?????????????????????????????? b.ToString("X").PadLeft(2, '0');
??????? }

??????? /// <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";
??????? }
??? }
}

復(fù)制代碼
復(fù)制代碼

??????? /// <summary>
??????? /// 2014-12-5 21:43:51
??????? /// 獲取一個(gè)RGB顏色值中的紅色強(qiáng)度值。
??????? /// </summary>
??????? /// <param name="rgb">指定的RGB顏色值。</param>
??????? /// <returns></returns>
??????? public static byte GetRValue(uint rgb)
??????? {
??????????? return (byte)rgb;
??????? }

??????? /// <summary>
??????? /// 2014-12-5 21:51:24
??????? /// 獲取一個(gè)RGB顏色值中的綠色強(qiáng)度值。
??????? /// </summary>
??????? /// <param name="rgb">指定的RGB顏色值。</param>
??????? /// <returns></returns>
??????? public static byte GetGValue(uint rgb)
??????? {
??????????? return (byte)(((ushort)(rgb)) >> 8);
??????? }

??????? /// <summary>
??????? /// 2014-12-5 21:52:37
??????? /// 獲取一個(gè)RGB顏色值中的藍(lán)色強(qiáng)度值。
??????? /// </summary>
??????? /// <param name="rgb">指定的RGB顏色值。</param>
??????? /// <returns></returns>
??????? public static byte GetBValue(uint rgb)
??????? {
??????????? return (byte)(rgb >> 16);
??????? }

復(fù)制代碼

不足之處,還望各位大神指正,不勝感激。

總結(jié)

以上是生活随笔為你收集整理的C#取色器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。