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

stu*_*ell 8 .net windows winapi gdi+ gdi

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

有更快的方法吗?

Ali*_*tad 10

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

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

  • 仅供参考,此链接现在转为垃圾邮件 (3认同)

val*_*ldo 7

GetPixel 有两个原因:

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

    相比之下,GetPixel在DIB上使用速度要快得多.

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

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

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

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