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

8
我有一堆PNG图片,想找到一种方法来识别重复的图片。 通过重复,我特指两个PNG文件的未压缩图像数据完全相同,而不一定是文件本身相同。这意味着我不能简单地比较CRC哈希值。
我认为这实际上是可靠的,因为PNG使用无损压缩,但我担心速度会受影响。我知道可以通过先测试相等的尺寸来缩小范围,但当需要实际比较图像时,是否有任何方法可以更有效地完成?(即比“双重循环检查像素值”的暴力方法更快?)

为什么需要两个循环?一个循环就足够了。 - kennytm
如果你将一张图片进行PNG压缩,那么即使你重复压缩两次,它也应该是相同的,这意味着你可以直接比较这两个PNG文件,对吗? - Chris
@Mason:好的。 但是它仍然每个像素迭代一次,所以我认为它是“1个循环”。 - kennytm
如果相同的灰度图像分别以32位RGB和256色索引存储,它们是否相等? - kennytm
2
@Chris -- 在使用 PNG 时,有一些参数可以调整。更改这些参数会影响文件的压缩程度,同时仍保持无损性,但会产生不同的输出文件。 - Michael Williamson
4个回答

13
  1. 按相同的图片尺寸(宽度和高度)过滤
  2. 打开文件
  3. 对未压缩的内容进行哈希处理(可能使用md5算法)
  4. 存储哈希值

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


3
我认为这是一个扎实的答案。在进行筛选后,对几个随机点进行快速像素采样/比较也可以淘汰一些图像。 - NG.
哦,好的。我原以为是“大小”指的是“文件大小”。 - zneak

6

不必按顺序循环检查每个像素是否相等,从中间开始向外扩展可能更值得尝试。大多数图片的主题位于中间,这意味着更多的特征数据位于此处。使用这种方法来判断两张图片是否不同会更快。


3
除非您预计会出现大量重复,否则平均而言,在确定两个文件不同之前,您不会比较许多像素。特别是如果您测试的每个像素距离已经测试过的像素很远,这将有助于例如具有相同背景颜色的线条艺术文件。
另外,您需要多准确呢?例如,如果以这种方式测试的10个像素是相同的,您能否安全地得出图像完全相同的结论?10个RGB像素=240位,因此随机图像的误匹配率应该是2^240 = 1 in 10^72!

它们不是随机图像,我预计会有相当高的重复比例。但测试随机值作为过滤技术的想法是一个好主意。 - Mason Wheeler

0

我想你可能可以调整读取的数据大小,即使存储格式完全不同。因此,如果您的图像是24位,则可能可以使用32位或64位(如果编译为64位)数据类型,并继续从两个图像中将数据打包到这些类型的两个变量中,然后比较这两个变量是否相等。这可能会加快速度 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接