是否有更快的GDI GetPixel()替代品?

时间:2010-11-21 00:13:34

标签: .net windows gdi+ gdi winapi

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

有更快的方法吗?

2 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:7)

GetPixel速度缓慢有两个原因:

  1. 由于您正在轮询屏幕 - 每次拨打GetPixel都会导致与视频驱动程序进行交易,视频驱动程序会从视频内存中获取像素数据。

    在DIB上使用GetPixel的速度非常快。

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

  3. 因此,如果您正在使用一次查询多个像素值 - 您应该尝试在单个事务中将其安排到GDI /视频驱动程序。

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

    使用GD +你可能实际上也是这样做的,语法稍微简单一些。