如何从图像文件中删除元数据


17

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

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

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

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

即使我不希望在原本相同的图像的不同副本之间发现任何损坏/数据腐烂,但我还是想检测一下,以及由于调整大小和颜色变化而引起的差异。

[ OP的编辑#3:为澄清起见:少量的误报是可以容忍的(文件在不存在时被断定是唯一的),而误报是非常不希望的(错误地将文件断定为重复的)。 ]

我的计划是在剥离所有元数据后,根据md5sums识别唯一性。

如何删除元数据?

exiftool -all= <filename>足够?


1
JPEG压缩库以不同的方式进行压缩,因此,即使剥离所有元数据,您仍可能以具有不同校验和的同一图像结尾,因为它是使用不同的JPEG实现压缩的。您将需要使用相同的库重新保存所有图像(这可能会降低质量)。另外,您打算如何查找所有图像? file将无法发现RAW图像格式,并且find仅适用于扩展名(更好地描述您所拥有的内容可能会有用)
grochmal

我一直在使用find $dir -type f -regextype posix-extended -regex ".*\.(jpg|png|<...>|cr2|raw|raf|orf)"where <...>意思是一堆其他后缀。
杰夫

关于不同压缩库的要点。
杰夫

1
您可以尝试使用BMP规范化图像convert image.jpg - | md5sum(ImageMagick)为您提供适当的MD5和。
aventurin

1
有一种称为phash的感知哈希算法,可用于比较两个图像在感知上的相似程度。stackoverflow在此处 具有标签stackoverflow.com/questions/tagged/phash现在具有比较两个文件的工具很有用,但可能导致工作O(n * n)。查找所有匹配项。可能有一些工作流程可以做得更好,但是我不知道一个有用的东西。但是phash是一个面包屑,可能会导致您陷入困境。显然imagemagick具有某种形式的phash支持
2013年

Answers:


12

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

-dc

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

-de

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

-di

删除IPTC部分(如果有)。保留其他元数据部分不变。

-dx

删除XMP部分(如果有)。保留其他元数据部分不变。

-du

删除jpeg的非Exif,非注释或其他对图像无贡献的部分-例如photoshop可能会留在图像中的数据。

-purejpg

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


旋转标签可以被认为是“渲染图像所必需的”。
杰夫

1
应该清楚,但仅适用于JPEG文件
serv-inc

6

对于大多数图像,我都会选择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 {} \;

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

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

对于RAW格式,我相信唯一的方法就是按照Phil的说法进行操作,因此:

find . <blah blah> -exec exiftool -all= {} \;

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

免责声明:这将用于比较它们之间的校验和。如果存储的校验和,然后重新运行-strip的更新后,zliblibjpeg可能具有完全不同的校验结束。您需要每次为每个图像构建校验和。考虑到图像质量,明智的做法是只运行一次


如果我错了,请纠正我。假设两个文件代表相同的图像,但使用两个不同的库压缩。它们会不会因为jpg有损而“解压缩”为不同的像素?
杰夫

1
JPEG2000通常没有明确定义的DCT,但这只是图像转换的一部分。哈夫曼编码也应该相同。但是,就标准而言,您实际上可以使用压缩库来压缩结果。从理论上讲,压缩库(例如zlib)将始终产生不同的结果(即使对于相同的算法),但是大多数jpeg库以相同的方式为RNG注入种子,以使事情保持理智(例如libjpeg这样做)。
grochmal

@Jeff这个问题很自然,因为有损意味着信息丢失了。
aventurin

当然,如果您定义了不同的压缩质量(例如-quality),则所有选择都将关闭。
grochmal

这个答案可能有问题。通过imagemagick option 插入包括JFIFversion在内的JFIF标签-strip。要查看此信息,请exiftool -a -G1 -s <filename>在使用mogrify -strip和创建的文件上运行exiftool -all=。要确认,请运行exiftool -a -G1 -s <original-filename> | grep JFIF。如果JFIF版本不同,将来的脚本运行将以某种方式将其考虑在内。
杰夫

6

有了imagemagick包,不仅是JPEG,您还可以简单地:

mogrify -strip *.jpg

手册

-strip

删除任何配置文件,注释或以下PNG块的图像:bKGD,cHRM,EXIF,gAMA,iCCP,iTXt,sRGB,tEXt,zCCP,zTXt,日期。

这里有更多信息和警告

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


按照该线程,最好exiftool -all= *.jpg剥离jpg数据。
Walt W

0

我想到了一个可能的解决方案。它回避了元数据的问题。它假定文件以图像本身结尾,所有元数据都位于文件的开头。

让我们将当前的备份驱动器称为黄金驱动器。

对于黄金驱动器上的图像:

  1. 删除所有嵌入的缩略图。
  2. 从尾部开始整理文件,例如,M = 100k字节。将第一个尾部(包含文件的末尾)称为末尾块。
  3. 计算每个块的md5sum,并将它们存储在称为goldlist的主列表中。

对于旧驱动器上的图像

  1. 删除所有嵌入的缩略图。
  2. 尾部关闭文件的最后M个字节。
  3. 计算其md5sum。
  4. U类:如果总和不在金牌列表中,则可以得出该文件对于金牌驱动器唯一的结论。将其复制到黄金驱动器。计算剩余块的md5sum,并将它们添加到金牌列表中。转到下一个文件。
  5. 否则,倒数第二个M字节。但是,如果剩余字节小于N = 50k,则不要拖尾M个字节。取而代之的是将剩余部分作为稍微大一些的块进行处理。N必须大于标头区域(不包括缩略图)占用的最大空间。
  6. 计算块的md5sum。
  7. 与金牌列表比较,依此类推。
  8. D类:如果所有块的总和都在金牌列表中,则得出结论是重复的。
  9. P类:如果除最后一个块外所有块的总和都在金表中,则可以得出结论,这很可能是重复的。

P类将包含黄金驱动器上的图像,但具有不同的exifdata,或在图像的前导字节中具有损坏/数据损坏。

完成后,以交互方式检查CLASS P,并将其与黄金驱动器上的伴侣进行比较。

参见编辑#3至OP。

分配给CLASS U和D的准确度应为100%。

P类的大小取决于块大小M,因为文件的前M + N个字节几乎可以肯定包含一些图像数据(以及所有元数据)


我对您的帖子进行了一些格式设置(因此它使用markdown枚举而不是拥挤的段落)。我仍然觉得弄清你对U类,D类,P类的意思是很深奥的
。–恶心的

将旧硬盘上的每个图像文件分配给U(nique),D(uplicate)P(可复制)三个类之一
Jeff

0

如果旧驱动器大部分包含重复项(包括元数据),则使用两个步骤来查找OP中定义的唯一性(即使两个文件在元数据上有所不同,OP也会将两个文件视为重复项):

  1. 使用完整的未剥离文件的md5sums来识别旧驱动器上的哪些文件对于当前备份驱动器是唯一的(在这种替代意义上),然后将它们分配给CLASS uU(未剥离的唯一)或CLASS D(upilcate)。D类将是100%准确的。CLASS uU应该很小(通过上述假设),并且包含真实重复项(在OP Sense中)和真实唯一性的混合。

  2. 使用CLASS uU中小的文件(即可管理的)文件集,使用md5sums和各种剥离技术来设计文件比较方法,该方法对于OP中列出的目的很有用。


0

这有点旧,但是可以,exiftool的效果很好。

显示的元数据

exiftool photo.jpg

显示所有* .jpg文件的metedata

注意:扩展名区分大小写

exiftool -ext jpg

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

exiftool -r -ext jpg .

删除所有元数据

exiftool -all= -overwrite_original photo.jpg

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

exiftool -all= -overwrite_original -ext jpg 

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

exiftool -all= -r -overwrite_original -ext jpg .

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

exiftool -gps:all= *.jpg
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.