C# Winform获取屏幕鼠标所指点的RGB和灰度值 Bitmap 1像素法(不调用系统API)

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();
                }
            }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值