在每个像素的基础上快速比较两个位图对象

2024-01-10

我目前正在实现一种接受两个位图对象的方法。我们可以假设所述对象具有相同的尺寸等。该方法的返回是像素变化的列表(这存储在自制对象中)。这是以迭代方式开发的,因此当前的实现是一个基本的实现......只需处理每个像素并将其与对应的像素进行比较。这种生成更改的方法比可接受的要慢(500 毫秒左右),因此我正在寻找更快的过程。

我想到的想法是将图像分解为条带并在新线程上运行每个比较,或者首先将屏幕区域作为对象进行比较,然后仅根据需要进行详细检查。

当前代码供您理解...

   for (int x = 0; x < screenShotBMP.Width; x++)
   {
       for (int y = 0; y < screenShotBMP.Height; y++)
       {
           if (screenShotBMP.GetPixel(x, y) != _PreviousFrame.GetPixel(x, y))
           { 
             _pixelChanges.Add(new PixelChangeJob(screenShotBMP.GetPixel(x,y), x, y));
           }
       }
   }

正如您将从代码中推断出的,相关类的概念是获取屏幕截图并根据之前获取的屏幕截图生成像素更改列表。


你绝对应该看看Lockbits https://web.archive.org/web/20141229164101/http://bobpowell.net/lockingbits.aspx操作位图数据的方法。

它比 GetPixel/SetPixel 快几个数量级。

EDIT:
Check 这个链接 https://social.msdn.microsoft.com/Forums/en-US/bd0eec9e-f811-4fab-a245-08b2882d005c/how-to-compare-grapical-bitmap-data?forum=vbgeneral对于一些代码(尽管是在 VB 中,但你应该明白)几乎可以满足你的要求。它只是检查两个位图是否相等并返回 true 或 false。您可以更改该函数,以便每个像素检查都会在必要时添加到您的 _pixelChanges 列表中,并返回此列表而不是布尔值。

此外,如果交换迭代器循环,速度可能会更快。即让内循环迭代 X,外循环迭代 Y。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在每个像素的基础上快速比较两个位图对象 的相关文章

随机推荐

  • 推荐的程序结构

    作为初学者 我已经制定了一些想法 但想向社区询问实施以下程序的最佳方法 它可以解码 8 种不同类型的数据文件 它们各不相同 但大多数相似 包含许多相似的字段 另外 有3代系统可以生成这些文件 每个都略有不同 但生成相同类型的文件 我需要制作
  • Typescript方法重载不同类型的参数但相同的响应

    我需要使用 TypeScript 重载一个方法 FooModel有 6 个参数 但 2 个字符串参数是唯一的强制参数 所以不是创建一个FooModel每次我想使用myMethod 我想超载myMethod并创建FooModel一旦进入那里
  • Rails 3 验证 IPv4 和 IPv6 格式

    我知道 IPv4 和 IPv6 的验证格式 但不确定如何将它们组合起来 所以至少一种格式应该是正确的 这是我的验证 validates src ip addr presence gt true uniqueness gt true form
  • 调用 php 中定义为对象变量的匿名函数[重复]

    这个问题在这里已经有答案了 我有如下 php 代码 class Foo public anonFunction public function construct this gt anonFunction function echo cal
  • Nodejs Scraper 不会移至下一页

    大家好 这是我其他问题的后续问题 我创建了一个 Nodejs Scraper 它似乎不想浏览页面 它停留在第一个页面 我的源代码如下 const rp require request promise const request requir
  • 如何验证 Blob 是否存在于已删除列表中

    以下代码将能够查看 blob 是否存在 var blob client GetContainerReference containerName GetBlockBlobReference blobFileName if blob Exist
  • 创建可变参数模板函数来测量和执行其他函数

    我目前正在尝试实现一个函数 该函数将任何其他函数和该函数的一组有 效输入值作为输入 并返回该函数的结果以及打印执行该函数所需的时间 这是我到目前为止所拥有的 template
  • Python 自定义日期时间(?) 格式处理

    假设我有一个代表时间和一周中的天数的字符串 例如 52300 表示一周的第 5 天 星期五 23 小时 00 分钟 我如何将其解析为时间或日期时间对象以添加 timedelta hours 3 并将其恢复为这种奇怪的格式 预期输出为 602
  • C语言使用Unix概念的目录监控代码

    在服务器上 进程监视 Unix 文件系统中的文件 如果客户端发送要监视的文件名 则服务器必须向客户端发送该文件是否被更改或删除的报告 对于服务器 客户端通信 我们应该使用消息队列或套接字 对于文件中的每个更改 服务器都必须通知该更改 对于所
  • 在 MacOS 上将 OpenSSL 更新到 1.1.1

    新的 LTS1 1 1 https www openssl org blog blog 2018 09 11 release111 的版本OpenSSL https github com openssl openssl is out 我如何
  • mongodb db.collection.find({}) 不执行任何超过 .limit(101) 的操作

    node mongodb 版本 2 0 43 和 MongoDB shell 版本 3 2 5 Centos虚拟机 我有一个 无上限 1600 个文档的集合 不是很大 并且所有文档都有标准的 BSON ids if I do db coll
  • sonar.analysis.mode 参数的替代方案

    我正在使用 Sonarqube 7 9 和 Gitlab 以及 Maven docker 映像 该映像使用以下命令调用我的 Sonarqubemvn batch mode verify sonar sonar DskipTests true
  • JavaFX 屏幕分辨率缩放

    我一直在寻找一种方法来做到这一点 但我只找到了这个问题没有答案 https stackoverflow com questions 32453173 javafx scale elements to screen resolution 我正
  • 在内联 GNU 汇编器中获取字符串长度

    我正在重新学习我在非常旧的 MS DOS 机器上使用的汇编程序 这是我对该函数应该是什么样子的理解 它编译但崩溃了SIGSEGV当试图把0xffffffff in ecx 该代码在具有 32 位 Debian 9 的 VM 中运行 如有任何
  • Matlab:二维数组,行不同长度

    在Matlab中 我想创建一个二维数组 但是 我无法创建矩阵 因为行的长度都不同 我是 Matlab 新手 我通常会在 C 中通过创建一个指针数组来完成此操作 每个指针都指向其自己的数组 我应该如何在Matlab中做到这一点 谢谢 您可以使
  • 上传和图像压缩

    我在客户的一个网站上使用 Uploadify 允许他们一次将大量图片上传到他们的照片库 我最近发现了一些问题 他们似乎上传大照片 3 MB 及以上 我想知道 是否可以在客户端压缩 减小它们的大小 而不是在服务器上进行压缩 就像 facebo
  • 从 Excel VBA 访问 Lotus Notes 数据库 - 如何选择 COLUMNVALUES?

    我正在研究将 Notes 数据库中的数据直接提取到 Excel 中 因为我们的财务人员正在手动重新输入数字 到目前为止 这是我的代码 子注释BB Const DATABASE 1247 Dim r As Integer Dim i As I
  • 如何从 Android 模拟器对 kik 的服务器 API 进行逆向工程?

    我有一个群聊基克信使 http kik com 会员数量已超过50人 我需要自动化一些事情 例如基于参与度的声誉点 以及踢掉 XXX 天没有发布任何内容的不活跃会员 我看过API参考 https dev kik com docs messa
  • 为什么 Google Chrome 模拟器以 375x667 分辨率显示 iPhone 6?

    我正在尝试以编程方式调整我的网站的图像大小以适应不同大小的设备 但现在我很难判断我真正需要的尺寸 在 Google Chrome 模拟器中 我看到一些图像放大了 例如在 iPhone 6 上从 230x230 自然显示到 357x357 该
  • 在每个像素的基础上快速比较两个位图对象

    我目前正在实现一种接受两个位图对象的方法 我们可以假设所述对象具有相同的尺寸等 该方法的返回是像素变化的列表 这存储在自制对象中 这是以迭代方式开发的 因此当前的实现是一个基本的实现 只需处理每个像素并将其与对应的像素进行比较 这种生成更改