JPEG内置校验和/指纹?

7
我正在编写一个脚本,以查找并删除大量图像库中的重复图像。目前,我正在进行两次过滤,首先查找相同大小的文件,然后对文件的10240字节片段进行sha256处理,以获取具有相同大小的文件的指纹(代码在这里)。
它运行良好,但我猜测jpeg格式中可能已经内置了校验和,我可以使用它们来代替sha256。是否有人知道是否存在校验和或其他可用作校验和/指纹的组件?如果是这样,是否有一种有效的方法来访问它们?

3
对于任何尝试类似操作的人:SHA家族旨在用于加密目的,对于这种类型的应用程序来说过于复杂,使用远简单于它的CRC即可(但我不会使用比MD5更复杂的算法)。由此产生的加速可以用于覆盖整个文件,而不是任意选择的10240字节。如果将CRC与规范化的大小说明(比如8字节)相结合,则第二次传递就是多余的。 - guidot
6个回答

5

我认为JPEG规范没有以你描述的方式包含任何类型的校验和。

JPEG可以作为其EXIF元数据的一部分包含缩略图。虽然它不是一个完美的指示器,因为两个不同的图像可能有相同的缩略图。至少有一个记录的情况,在图像经过重大修改后,缩略图没有被替换,该缩略图揭示了发布者意图之外的更多信息。


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

1

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


0
在JPEG标准(ITU-T.81)中,我相信没有任何字段/语法元素具有整个压缩的JPEG图像文件的校验和或类似内容。除非定制应用程序将这样的字段放入应用程序段中,或者作为元数据提供给标准中提供的哪些段。 因此,为了达到您的目的,您正在执行一种解决方案。 另一种可能是某种应用程序包装器,它将调用某些二进制文件比较实用程序(如Beyond Compare,甚至是Windows命令fc /b),并检查该比较实用程序的结果并采取您想要的决策。
-AD

0

一种方式是将所有图像缩小到固定大小并将其作为缩略图存储。然后,图像比较将比较尺寸相似的图像,并给您查找重复内容的机会——如果您已剪裁(除非剪得非常多)或调整大小的图像,并且想要查找那些“重复”的图像,这会非常有用。


0
在XMP规范中,有文档ID和版本ID,它们应该唯一地标识图像的版本。
这些(以及任何其他基于元数据的识别方法)的问题在于,某些应用程序可能不会尊重它们,而可以更改JPEG的内容并相应地更新元数据。

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