有更快的替代GDI GetPixel()?

我在.NET应用程序中使用gdi32.dll中的GetPixel()来对屏幕上任意位置的像素进行采样。 它工作正常,但它是我的主要性能瓶颈。

有没有更快的方法呢?

Solutions Collecting From Web of "有更快的替代GDI GetPixel()?"

使用Bitmap LockBits()方法可以快速访问像素。 这会返回一个包含指向像素数据开始的指针的对象,您可以使用不安全的代码来访问内存。

http://www.bobpowell.net/lockingbits.htm

GetPixel由于两个原因而变慢:

  1. 由于您正在轮询屏幕 – 每次调用GetPixel导致视频驱动程序发生事务,而视频驱动程序又会从视频内存中获取像素数据。

    相比之下,在DIB上使用GetPixel要快得多。

  2. 无论如何, GetPixel做了几件事,包括坐标剪切/转换等。

所以,如果你用来一次查询许多像素值 – 你应该尝试安排在一个单一的交易到GDI /视频驱动程序。

使用GDI你应该创建一个适当大小的DIB(参见CreateDIBSection )。 创建之后,您将获得一个直接指向图像位数据的指针。 然后将图像部分复制到您的DIB(请参阅BitBlt )。 在实际检查DIB的内容之前,不要忘记调用GdiFlush (因为视频驱动程序可能会执行异步绘图)。

使用GD +你可能会用相同的语法做一些简单的操作。