比 GetPixel() 快吗?

Posted

技术标签:

【中文标题】比 GetPixel() 快吗?【英文标题】:Faster than GetPixel()? 【发布时间】:2014-12-30 21:06:42 【问题描述】:

如何将GetPixel() 替换为更快的东西?

目前我正在使用:

temp = GetPixel(hMonitor, 1, 1);
if (pixelArray[0] != temp)

    pixelArray[0] = temp;
    counter++;

以上代码只是一个简化的例子。

这包含在显示屏上所有像素的 for 循环中。它将一个像素 (temp) 与前一个阵列的像素 (pixelArray) 进行比较。如果它已更改,则更换它。但是,我发现对显示屏上的每个像素使用 GetPixel() 需要很长时间。

我一直在阅读其他类似性质的问题,例如:

Fastest method of screen capturing

Get Pixel color fastest way?

...但我不确定哪种方法更好,例如 GDI 或 DirectX,也不知道我将如何实现这些方法。

更新:Windows GDI(使用 GetObject)到像素数组是我需要的,谢谢。这比 GetPixel() 快得多。

【问题讨论】:

铅笔、纸和放大镜比 GetPixel 更有效,所以选择吧。 如何在我当前的代码中实现它? 你真正想用这个解决什么问题? @ChuckWalbourn 本质上是在每个监视器的内存或磁盘中保存屏幕截图,然后每隔一分钟左右检查是否有任何变化(如果他们有增加计数器并替换字节,无符号长等.) 问题不在于你找不到解决方案,你已经从你发布的链接中找到了,而是如何实现这些。意思是你不理解他们。你需要先学习GDI或directX。我就是这样做的,你也应该这样做。 【参考方案1】:

我建议您检索指向位图像素数据的指针(假设您有 HBITMAP 句柄)。

这是通过GetObject() 完成的,它应该会返回一个BITMAP structure。这是您感兴趣的领域:

bmBits: 指向位图位值位置的指针。这 bmBits 成员必须是指向字符数组(1 字节)的指针 价值观。

然后您可以在缓冲区上运行每个像素的检查逻辑。使用 GetPixel 会更快。

【讨论】:

以上是关于比 GetPixel() 快吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 Android.Graphics.Bitmap.GetPixels 获得的 RGB 值与 System.Drawing.Bitmap.GetPixel 略有不同

使用getPixel()方法然后检查rgb值

单色位图SetPixel/GetPixel问题... Win32 C代码

VB用GetPixel屏幕取色的几个问题

AS3中bitmapData.getPixel32获取PNG图片颜色

GDI GetPixel() 有更快的替代方案吗?