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

时间:2010-03-21 18:45:58

标签: algorithm delphi png

我有一堆PNG图像,我正在寻找一种识别重复的方法。通过重复,我的意思是,具体地说,两个PNG文件的未压缩图像数据是相同的,不一定是其文件相同。这意味着我无法像比较CRC哈希值那样简单。

我认为这实际上可以可靠地完成,因为PNG使用无损压缩,但我担心速度。我知道我可以通过首先测试相同尺寸来稍微减少一些东西,但是当实际比较图像时,有没有什么方法可以合理有效地进行? (也就是说,比“双重循环检查像素值相互比较”蛮力方法更快?)

4 个答案:

答案 0 :(得分:13)

  1. 按相同图像尺寸(宽度和高度)过滤
  2. 打开文件
  3. 散列未压缩的内容(md5可能会这样做)
  4. 商店哈希

  5. 比较哈希以找到相同的哈希

答案 1 :(得分:6)

不是循环遍历所有像素以检查相等性,而是从中间开始向外工作,这可能是值得的。大多数图片都有中间的主题意味着更多的功能数据位于此处。基本上,通过这种方式查看两张图片是否不同会更快。

答案 2 :(得分:3)

除非您期望大量重复,否则在确定2个文件不同之前,您不会比较多个像素。特别是如果您测试的每个像素都远离已测试的像素。这有助于例如具有相同背景颜色的艺术线条文件。

另外,你有多准确?例如,如果以这种方式测试的10个像素相同,您能否安全地断定图像是相同的? 10个RGB像素= 240位,因此随机图像的误匹配率应为1 ^ 2 ^ 240 = 1 10 ^ 72!

答案 3 :(得分:0)

我认为即使存储格式完全不同,您也可以调整正在读取的数据的大小。因此,如果您的映像是24位,则可以使用32位或64位(如果是64位编译的)数据类型,并将这些数据的两个变量中的数据打包并比较两者的相等性。这可能会加速一些事情:)