当前位置:   article > 正文

获取窗体上的指定点像素_getdc 像素 读

getdc 像素 读

好久没有写博客了,准备想坚持写,才刚开了一个头就没坚持下来,恰好今天有点时间,所以就打算写一篇博客。

上一篇我通过获取第三方窗体句柄将第三方窗体嵌入到自己的窗体中,很多时候不是嵌进取就完事了,我们需要操作第三方窗体,获取读取上面的信息,通常我们会读取上面的像素,所以今天就介绍如何读取第三方窗体指定点的像素。

通常我们想到的就是截图,一般电脑自带的截图就是截取整个屏幕,由于坐标的关系,这不利于我们后续的处理。所以win32api库给我们提供了一个很好的方法

HDC GetDC(HWND hWnd),

hWnd:设备上下文环境被检索的窗口的句柄,如果该值为NULL,GetDC则检索整个屏幕的设备上下文环境。

返回值:如果成功,返回指定窗口客户区的设备上下文环境;如果失败,返回值为Null。

这就是用来截取指定窗体的图像,如何调这个方法大家就自己百度一下如何调win32api库就行,非常简单的得到截图后,我们还需要对图像就行像素提取,我这里用的是gdi库下的

GetPixel(HDC hdc, int nXPos, int nYPos)函数,

hdc:设备环境句柄。
nXPos:指定要检查的像素点的逻辑X轴坐标。
nYPos:指定要检查的像素点的逻辑Y轴坐标。
返回值:返回值是该象像点的 RGB值。如果指定的像素点在当前剪辑区之外;那么返回值是CLR_INVALID。
这就是最核心的地方了,话不多说,直接上代码啦
        public static Color GetColor(IntPtr hwnd, int dx, int dy)
        {
            int hdc = User.GetDC(hwnd);
            int pixel = GDI.GetPixel((IntPtr)hdc, dx, dy);
            User.ReleaseDC(IntPtr.Zero, (IntPtr)hdc);
            Color color = Color.FromArgb((int)(pixel & 0x000000FF), (int)(pixel & 0x0000FF00) >> 8, (int)(pixel & 0x00FF0000) >> 16);
            return color;

        }

我这里直接将它封装成了一个方法大家可以直接调用就行。

        private void button1_Click(object sender, EventArgs e)
        {
            Color c= GetColor((IntPtr)handle,10,10);
            richTextBox1.AppendText("R:"+c.R.ToString()+"\r\n");
            richTextBox1.AppendText("G:" + c.G.ToString() + "\r\n");
            richTextBox1.AppendText("B:" + c.B.ToString() + "\r\n");

        }

执行结果:


是不是感觉很简单,这个在项目中经常用到,尤其是图像判断之类的。那么如何精确定位到某一个指定位置呢,我将会在我的下一篇博客和大家一起分享!
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/604263
推荐阅读
相关标签
  

闽ICP备14008679号