C#获取屏幕鼠标所指点的颜色
最近有一些需求,需要鼠标到达图像显示区域后显示对应的rgb并计算灰度,跟随鼠标move一直调用。试了网上一些代码不太好用。就是调用后无效,心烦意乱,于是写了一个。
废话不多说直接上代码(直接复制,即插即用):
注意 代码内的lastMousePosition是控件内的xy坐标,Cursor.Position.X/Y是屏幕xy坐标
注意 代码内的lastMousePosition是控件内的xy坐标,Cursor.Position.X/Y是屏幕xy坐标
注意 代码内的lastMousePosition是控件内的xy坐标,Cursor.Position.X/Y是屏幕xy坐标
自己捋一下思路。控件内坐标是控件内的,比如图像坐标(0,0)他并不一定是屏幕的(0,0)点。
为什么要用屏幕坐标?
因为要抓1*1的图来获取rgb,控件内抓我没成功。
最后别忘了绑定控件内鼠标move事件,坐标输出要选对变量。
private Bitmap screenshot; // 声明 Bitmap 变量
private DateTime lastColorFetchTime;
private Point lastMousePosition;
/// <summary>
/// 设置获取鼠标左边和灰度值的频率
/// </summary>
private const int FetchInterval = 50; // 设置间隔为50毫秒
private void PictureWindowBox_MouseMoveEvent(object sender, _DIpeDspCtrlEvents_MouseMoveEvent e)
{
lastMousePosition = new Point(e.x, e.y); // 更新最后鼠标真实图像位置
if (lastMousePosition!= Point.Empty)
{
// 检查与上次获取颜色的时间间隔,鼠标的mousemove事件并不能按照我们想要的频率更新我们的值,
//不用计时器,我们自己设置一个时间间隔来控制更新帧率,这样既不掉帧,又能给他充足的时间来计算RGB值
if ((DateTime.Now - lastColorFetchTime).TotalMilliseconds >= FetchInterval)
{
lastColorFetchTime = DateTime.Now; // 更新上次获取时间
//获取屏幕中鼠标的位置
Point p = new Point(Cursor.Position.X, Cursor.Position.Y);
//创建1*1的图像块
screenshot = new Bitmap(1, 1);
using (Graphics g = Graphics.FromImage(screenshot))
{
//抓屏幕上的1*1图像块赋值给screenshot
g.CopyFromScreen(p.X, p.Y, 0, 0, new Size(1, 1));
}
Color pixelColor = screenshot.GetPixel(0, 0); // 获取颜色
//计算灰度值
int grayValue = (int)(pixelColor.R * 0.299 + pixelColor.G * 0.587 + pixelColor.B * 0.114);
//自己拿值去用吧
//这是更新鼠标坐标↓
//X_Point_Value.Text = lastMousePosition.X.ToString();
//Y_Point_Value.Text = lastMousePosition.Y.ToString();
//这是更新鼠标下的RGB
//R_Value.Text = pixelColor.R.ToString();
//G_Value.Text = pixelColor.G.ToString();
//B_Value.Text = pixelColor.B.ToString();
//Gray_Value.Text = grayValue.ToString();
//每次用完释放一次
screenshot.Dispose();
}
}
}