有没有比 GDI GetPixel() 更快的替代方法?

发布于 2024-10-03 22:14:16 字数 119 浏览 3 评论 0原文

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

有没有更快的方法?

I'm using GetPixel() from gdi32.dll in a .NET app to sample the colour of a pixel anywhere on the screen. It works ok but it is a major performance bottleneck for me.

Is there a faster way of doing it?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

花期渐远 2024-10-10 22:14:16

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

https://web.archive.org/web/ 20150330113356/http://bobpowell.net/lockingbits.aspx

Fast access to pixels are possible using LockBits() method of the Bitmap. This will return to you an object containing a pointer to the start of the pixel data and you can use unsafe code to access the memory.

https://web.archive.org/web/20150330113356/http://bobpowell.net/lockingbits.aspx

扶醉桌前 2024-10-10 22:14:16

GetPixel 速度较慢有两个原因:

  1. 由于您正在轮询屏幕 - 每次调用 GetPixel 都会导致视频驱动程序发生事务,而视频驱动程序又需要来自视频内存的像素数据。

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

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

因此,如果您用于一次查询许多像素值 - 您应该尝试将其安排在 GDI / 视频的单个事务中司机。

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

使用 GD+,您实际上可以做同样的事情,但语法更简单一些。

GetPixel is slow for two reasons:

  1. Since you're polling the screen - every call to GetPixel leads to a transaction to the video driver, which in turn takes the pixel data from the video memory.

    In constrast using GetPixel on DIBs is very much faster.

  2. Anyway GetPixel does several things, including coordinates clipping/transformations and etc.

So that if you're using to query many pixel values at once - you should try to arrange this in a single transaction to GDI / video driver.

Using GDI you should create a DIB of the adequate size (see CreateDIBSection). After creation you'll be given a direct pointer to the image bits data. Then copy the image part onto your DIB (see BitBlt). Also don't forget to call GdiFlush before you actually check the contents of the DIB (since video drivers may do asynchronous drawing).

Using GD+ you may actually do the same, with a bit simpler syntax.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文