Algorithm 有没有简单的方法来测试两个PNG是否相等?

Algorithm 有没有简单的方法来测试两个PNG是否相等?,algorithm,delphi,png,Algorithm,Delphi,Png,我有一堆PNG图像,我正在寻找一种识别重复的方法。我所说的复制是指两个PNG文件,它们的未压缩图像数据是相同的,而不一定它们的文件是相同的。这意味着我不能做一些简单的事情,比如比较CRC哈希值 由于PNG使用无损压缩,我认为这实际上可以可靠地完成,但我担心速度。我知道我可以通过先测试相等的维度来降低一些东西,但是当需要实际比较图像时,有没有什么方法可以合理有效地进行比较?(即,比“双循环相互检查像素值”蛮力方法更快?) 按相同图像大小(宽度和高度)过滤 打开文件 散列未压缩的内容(md5可能可以

我有一堆PNG图像,我正在寻找一种识别重复的方法。我所说的复制是指两个PNG文件,它们的未压缩图像数据是相同的,而不一定它们的文件是相同的。这意味着我不能做一些简单的事情,比如比较CRC哈希值

由于PNG使用无损压缩,我认为这实际上可以可靠地完成,但我担心速度。我知道我可以通过先测试相等的维度来降低一些东西,但是当需要实际比较图像时,有没有什么方法可以合理有效地进行比较?(即,比“双循环相互检查像素值”蛮力方法更快?)

  • 按相同图像大小(宽度和高度)过滤
  • 打开文件
  • 散列未压缩的内容(md5可能可以)
  • 存储散列

  • 比较散列以找到相同的散列


  • 我认为您可能能够调整正在读取的数据的大小,即使存储格式完全不同。因此,如果您的映像是24位的,那么您可以使用32位或64位(如果是64位编译的)数据类型,并将两个映像中的数据打包到这两种类型的两个变量中,然后比较两者是否相等。这可能会加快速度:)

    与其在所有像素之间循环以检查相等性,不如从中间开始,向外工作。大多数图片的主题在中间,更多的特征数据位于这里。基本上,通过这种方式可以更快地确定两张图片是否不同。

    除非您期望有大量重复,否则平均而言,在确定两个文件不同之前,您不会比较许多像素。尤其是如果您测试的每个像素都远离已测试的像素。这将有助于处理具有相同背景颜色的线条艺术文件


    还有,你必须准确到什么程度?例如,如果以这种方式测试的10个像素是相同的,您能安全地得出图像是相同的结论吗?10个RGB像素=240位,因此随机图像的错误匹配率应为1/2^240=1/10^72

    为什么需要两个循环?1个循环就足够了。当然,如果你对一幅图像进行PNG压缩,如果你重复两次,结果会是一样的,这意味着你应该能够直接比较这两个PNG?@Mason:好的。但是它仍然迭代每个像素一次,所以我认为它是“1个循环”。如果相同的灰度图像分别被存储为32位RGB和256个颜色索引,它们是否相等?@克里斯——在使用PNG时,有一些参数可以调整。更改这些参数将影响文件的压缩量,虽然仍然是无损的,但会产生不同的输出文件。我认为这是一个可靠的答案。在过滤之后,一些随机点上的快速像素采样/比较可能也会删除一些图像。哦,好的。我认为这是“文件大小”中的“大小”。它们不是随机的图像,我希望复制的比例相当高。但是,将测试随机值作为一种过滤技术的想法是一种很好的方法。