代码之家  ›  专栏  ›  技术社区  ›  Mason Wheeler

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

  •  6
  • Mason Wheeler  · 技术社区  · 14 年前

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

    我认为这实际上可以可靠地完成,因为PNG使用无损压缩,但我担心的是速度。我知道我可以通过首先测试相同的维度来筛选一些东西,但是当需要实际比较图像时,是否有任何方法可以合理有效地进行比较?(也就是说,比“双循环”快速检查像素值对彼此“蛮力法”?

    4 回复  |  直到 14 年前
        1
  •  3
  •   user298660    14 年前

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

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

        2
  •  13
  •   ChristopheD    14 年前
    1. 按相同的图像大小(宽度和高度)筛选
    2. 打开文件
    3. 哈希未压缩内容(MD5可能会这样做)
    4. 存储哈希

    5. 比较哈希值以查找相同的哈希值

        3
  •  6
  •   Chris    14 年前

    不是通过循环遍历所有像素来检查相等性,而是从中间开始向外工作。大多数图片的主题在中间,这意味着更多的功能数据位于此处。从本质上讲,如果用这种方法发现两张图片是不同的,会更快。

        4
  •  0
  •   Chris Dennett    14 年前

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