是否有exif / xmp / iptc的结束标记或数据起始标记,可以用来获取jpg / jpeg(以及其他图像格式)中仅数据部分的校验和?
我认为这个问题与这个问题相关:计算图像的核心数据(不包括元数据)的哈希值,https://dev59.com/i2kw5IYBdhLWcg3wMHkY#10075170 提供了一个代码示例。
然而,它可能无法处理所有JPG文件变体:其中一些可以嵌入多个图像(MPF / CIPA多图片格式,更多信息请参见 http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/MPF.html),你仍然可能具有一些元数据。此外,一些软件会在文件末尾以--[0-9A-F]+--的形式放置UID,不应读取该UID。最安全的解决方案可能是校验像素(虽然您仍然可能受到方向、颜色配置文件等的影响)。
获取仅像素数据的哈希值的一种简单方法是将JPEG转换为32位BMP或PNG,然后从中计算哈希值。这将剥离JPEG的所有相关信息,并且甚至可以匹配导致相同像素数据的不同编码的JPEG。当然,如果您有结果BMP的内存像素数据(即Windows具有多个API函数可从任何支持的图像类型中获取它),您也可以直接使用它。
由于您想对各种图像格式执行此操作,因此您应该使用通用图像解压库并在未压缩的数据上运行您的校验和。这将使您能够匹配相同的图像,即使它们在磁盘上以不同的方式编码。
如果您想限制自己只使用JPEG,则可以在SOI和EOI之间对数据进行校验和。 此答案 可以稍微调整以满足您的需求。