如何从图像文件中剥离元数据

Jef*_*eff 30 exif file-metadata

[ OP 编辑​​ #1:事实证明,exiftool 创建者/维护者 Phil Harvey 在ExifTool 论坛上的一个重复线程中很好地回答了这个问题]

[ OP 编辑​​ #2:来自ExifTool 常见问题解答ExifTool在尝试删除所有元数据时不能保证从文件中完全删除元数据。请参阅“作家限制”。]

我想在旧硬盘上搜索当前备份驱动器上没有的照片。格式包括 jpg、png、tif 等...,以及各种原始格式(不同的相机型号和制造商)。

我只对图像本身的唯一性感兴趣,而不是由于 exif 标签的值、给定 exif 标签本身的存在/不存在、嵌入的缩略图等的差异而引起的唯一性......

尽管我不希望在其他相同图像的不同副本之间发现任何损坏/数据腐烂,但我想检测到这一点,以及由于调整大小和颜色变化而导致的差异。

[编辑 #3 由 OP:澄清:一小部分误报是可以容忍的(如果文件不是唯一的,则认为它是唯一的),而漏报是非常不可取的(文件被错误地推断为重复)。 ]

我的计划是在剥离任何和所有元数据后根据 md5sums 确定唯一性。

如何剥离元数据?

exiftool -all= <filename>足够?

Pab*_*o A 23

使用imagemagickpackage 而不仅仅是 JPEG,您可以简单地:

mogrify -strip *.jpg
Run Code Online (Sandbox Code Playgroud)

手册

-strip

去除任何配置文件、评论或这些 PNG 块的图像:bKGD、cHRM、EXIF、gAMA、iCCP、iTXt、sRGB、tEXt、zCCP、zTXt、日期。

更多信息和注意事项在这里

注意:这类似于@grochmal,但更直接和简单。

  • 根据该线程,最好使用 `exiftool -all= *.jpg` 来去除 jpg 数据。 (3认同)
  • 请注意,这还将删除“方向”元数据,这将使某些照片看起来旋转方向错误。 (3认同)

Tob*_*ght 15

jhead能够从 JPEG 文件中删除非图像元数据。手册页说:

-dc

从 JPEG 标题中删除注释字段。请注意,注释不是 Exif 标头的一部分。

-de

完全删除 Exif 标头。保持其他元数据部分不变。

-di

删除 IPTC 部分(如果存在)。保持其他元数据部分不变。

-dx

删除 XMP 部分(如果存在)。保持其他元数据部分不变。

-du

删除不是 Exif 的 jpeg 部分,不是评论,否则也不会对图像做出贡献 - 例如 photoshop 可能会在图像中留下的数据。

-purejpg

删除渲染图像不需要的所有 JPEG 部分。去除各种应用程序可能留在图像中的任何元数据。-de -dc-du 选项的组合。

  • 旋转标签可以被视为“渲染图像所必需的”。* (2认同)
  • 应该很清楚,但**仅适用于 JPEG** 文件 (2认同)

R J*_*R J 14

这有点老了,但是,exiftool 工作得很好。

显示元数据

exiftool photo.jpg
Run Code Online (Sandbox Code Playgroud)

显示所有 *.jpg 文件的元数据

注意:扩展名区分大小写

exiftool -ext jpg
Run Code Online (Sandbox Code Playgroud)

与上面相同,但包括子目录。

exiftool -r -ext jpg .
Run Code Online (Sandbox Code Playgroud)

删除所有元数据

exiftool -all= -overwrite_original photo.jpg
Run Code Online (Sandbox Code Playgroud)

删除当前目录中所有 *.jpg 文件的所有元数据

exiftool -all= -overwrite_original -ext jpg 
Run Code Online (Sandbox Code Playgroud)

与上面相同,但包括子目录。

exiftool -all= -r -overwrite_original -ext jpg .
Run Code Online (Sandbox Code Playgroud)

删除当前目录中 *.jpg 文件的所有 GPS 元数据

exiftool -gps:all= *.jpg
Run Code Online (Sandbox Code Playgroud)


gro*_*mal 8

对于大多数图像,我会使用 ImageMagick。这是因为不同的库实现会产生不同的压缩结果,ImageMagick 可以进行压缩统一。

常见类型很容易,因为操作系统有库来读取和写入它们。所以:

find . -type f -name '*.jp*g' -o -type f -name '*.JP*G' \
       -exec mogrify -strip -taint -compress JPEG {} \;

find . -type f -name '*.png' -o -type f -name '*.PNG' \
       -exec mogrify -strip -taint -compress Lossless {} \;

find . -type f -name '*.gif' -o -type f -name '*.GIF' \
       -exec mogrify -strip -taint -compress LZW {} \;
Run Code Online (Sandbox Code Playgroud)

这将确保您以相同的方式编写图像。然后你可以执行:

find . -type f -regextype posix-extended \
       -regex ".*\.(jpe?g|JPE?G|png|PNG|gif|GIF)" \
       -exec md5sum {} \; > checksums
sort -k 1 checksums |
cut -d ' ' -f 1 |
uniq -d |
while read x; do
    grep $x checksums
done
Run Code Online (Sandbox Code Playgroud)

对于 RAW 格式,我相信唯一的方法就是按照 Phil 所说的去做,因此:

find . <blah blah> -exec exiftool -all= {} \;
Run Code Online (Sandbox Code Playgroud)

然后校验和将是相同的。您只需要交叉手指,可以使用单个实现(或具有严格的文件格式)创建更奇特的图像格式。

免责声明:这将用于比较它们之间的校验和。如果您存储校验和,然后-strip在更新后重新运行,zlib或者libjpeg您可能会以完全不同的校验和结束。您每次都需要为每个图像构建校验和。考虑到图像质量,最好只运行一次