我在一个.NET应用程序中使用gdi32.dll中的GetPixel()
来采样屏幕上任何位置的像素颜色。它能够正常工作,但对于我来说是一个主要的性能瓶颈。
有没有更快的方法来实现这个功能?
通过使用Bitmap
的LockBits()
方法,可以快速访问像素。这将返回一个包含指向像素数据开头的指针的对象,并且您可以使用不安全代码访问内存。
https://web.archive.org/web/20150330113356/http://bobpowell.net/lockingbits.aspx
GetPixel
之所以慢,有两个原因:
由于您正在轮询屏幕 - 每次调用 GetPixel
都会导致与视频驱动程序的交易,视频驱动程序从视频内存中获取像素数据。
相比之下,在 DIB 上使用 GetPixel
要快得多。
无论如何,GetPixel
做了很多事情,包括坐标剪辑/变换等。
因此,如果您要一次查询许多像素值,则应尝试将其安排在单个 GDI / 视频驱动程序事务中。
使用 GDI,您应该创建一个适当大小的 DIB(请参见 CreateDIBSection
)。创建后,您将获得指向图像位数据的直接指针。然后将图像部分复制到您的 DIB 上(请参见 BitBlt
)。在实际检查 DIB 内容之前,还不要忘记调用 GdiFlush
(因为视频驱动程序可能进行异步绘制)。
使用 GD+,您实际上可以使用更简单的语法执行相同的操作。