我在.NET应用程序中使用gdi32.dll中的GetPixel()
来对屏幕上任意位置的像素颜色进行采样。它工作正常,但它对我来说是一个主要的性能瓶颈。
有更快的方法吗?
答案 0 :(得分:10)
使用LockBits()
的{{1}}方法可以快速访问像素。这将返回一个包含指向像素数据开头的指针的对象,您可以使用不安全的代码来访问内存。
答案 1 :(得分:7)
GetPixel
速度缓慢有两个原因:
由于您正在轮询屏幕 - 每次拨打GetPixel
都会导致与视频驱动程序进行交易,视频驱动程序会从视频内存中获取像素数据。
在DIB上使用GetPixel
的速度非常快。
无论如何GetPixel
做了几件事,包括坐标剪裁/转换等。
因此,如果您正在使用一次查询多个像素值 - 您应该尝试在单个事务中将其安排到GDI /视频驱动程序。
使用GDI,你应该创建一个足够大小的DIB(见CreateDIBSection
)。创建后,您将获得指向图像位数据的直接指针。然后将图像部分复制到DIB上(参见BitBlt
)。另外,在实际检查DIB的内容之前不要忘记调用GdiFlush
(因为视频驱动程序可能会进行异步绘图)。
使用GD +你可能实际上也是这样做的,语法稍微简单一些。