有比GDI GetPixel()更快的替代方法吗?(提问关于IT技术)

9

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

有没有更快的方法来实现这个功能?


2
你需要什么样的用法?从屏幕上抓取一个区域,然后对其进行像素采样可能是值得的。 - hometoast
我的应用程序允许用户实时从屏幕上的任何位置(在我的应用程序之外)取样颜色。关于限制区域的好主意,我会看看能否实现。 - stucampbell
2个回答

12

谢谢。我已经点赞了,因为这是一篇对于我正在进行的一些图像操作非常有用的文章。但它并不能帮助我获取屏幕上任何像素的颜色(除非我先截屏,这不是我想要的)。 - stucampbell

9
< p > GetPixel 之所以慢,有两个原因:

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

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

  2. 无论如何,GetPixel 做了很多事情,包括坐标剪辑/变换等。

因此,如果您要一次查询许多像素值,则应尝试将其安排在单个 GDI / 视频驱动程序事务中。

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

使用 GD+,您实际上可以使用更简单的语法执行相同的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接