【问题标题】:JPEG built-in checksum / fingerprint?JPEG内置校验和/指纹?
【发布时间】:2008-10-20 04:53:59
【问题描述】:

我正在编写一个脚本来查找大型图像库中的删除重复项。目前我正在做一个两通过滤器,首先查找相同大小的文件,然后对文件的 10240 字节片段执行 sha256 以获得相同大小的文件的指纹(代码here)。

它工作得很好,但我猜可能有内置到 jpeg 格式的校验和,我可以使用它来代替 sha256。

有谁知道是否有校验和或其他组件可以充当校验和/指纹?如果是这样,是否有有效的方法来访问它们?

【问题讨论】:

  • 对于任何尝试类似事情的人:SHA 系列旨在用于加密目的并且对于此类应用程序而言不必要的复杂性,一个简单得多的 CRC 就足够了(但我不会做任何比 MD5 更复杂的事情)。由此产生的加速可用于覆盖整个文件,而不是任意选择的 10240。如果 CRC 与标准化大小规范(例如 8 字节)相结合,则第二遍已过时。

标签: checksum jpeg fingerprint


【解决方案1】:

我认为 JPEG 规范不包含您所描述的任何类型的校验和。

不过,JPEG 可以包含缩略图作为其 EXIF 元数据的一部分。这不是一个完美的指标,因为两个不同的图像可能具有相同的缩略图。至少有一个记录在案的情况是,在图像经过大量修改后,缩略图没有被替换,据说缩略图显示的内容远远超出了发布者的预期。

【讨论】:

    【解决方案2】:

    我已经有一段时间没有研究 IJG 库了,但我认为没有一个简单的类成员或函数调用可以用来检查某种类型的指纹。如果您可以控制图像的编码,则可以使用内置的 EXIF 标签...

    【讨论】:

      【解决方案3】:

      我刚刚构建了一个非常相似的脚本。我不想校验和元数据我想查看实际图像是否重复,即使标签已被修改。最好的方法不是按大小排序,而是按校验和 istelf 排序。我使用 jhead 删除元数据,然后对整个文件进行校验和(但我也想过只做一部分,但实际上我认为它不会节省太多时间)。 jhead 不使用共享内存(管道)并且会覆盖,所以我只是先将文件复制到共享内存。我将校验和放在 ImageDescription 字段中,以便以后更快地检索。显然,这也允许稍后检查图像完整性,这也是我校验整个事情的部分原因。提示:exiv2 在读取和写入元数据方面比 exiftool 在一次基于决策的操作方面快得多。

      【讨论】:

        【解决方案4】:

        在 JPEG 标准(ITU-T.81)中,我相信对于整个压缩的 jpeg 图像文件,没有任何具有校验和等的字段/语法元素。除非定制的应用程序将此类文件放在应用程序段中,或者作为标准中提供的段的元数据。 因此,为了达到您的目的,您所做的只是一个解决方案。 其他可能是某种应用程序包装器,它将调用一些二进制文件比较实用程序(如超越比较,甚至是 Windows 命令 fc /b)并检查该比较实用程序的结果并做出决定想要。

        -AD

        【讨论】:

          【解决方案5】:

          您可以执行的一种方法是将所有图像缩小到固定大小并将其存储为缩略图。然后,图像比较会比较尺寸相似的图像,并为您提供复制的机会 - 如果您已裁剪(除非大量裁剪)或调整大小的图像并希望找到那些“重复”,这将非常有用。

          【讨论】:

            【解决方案6】:

            在 XMP 规范中有文档 ID 和版本 ID,它们应该唯一标识图像的版本。

            这些(以及任何其他基于元数据的识别方法)的问题在于,某些可以更改 jpeg 内容并相应更新元数据的应用程序可能不尊重它。

            【讨论】:

              猜你喜欢
              • 2023-03-14
              • 1970-01-01
              • 2015-05-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多