在我的图像处理软件周围,我使用 exiftool 成功地洗牌来自 Cr2、TIFF、JPG 文件的 exif 信息。添加的标签,例如“关键字”,在 OSX(山狮)Finder、预览中都可见,并被 Spotlight 很好地索引。
对于 PNG,我需要回退到 XMP,因为这是 PNG 的元数据容器。但是,Preview 和 SpotLight 似乎都没有选择 exiftool 添加的标签。相反,如果我先在预览中添加一个标签,然后使用 exiftool 添加一个新标签,这就是索引。我在 XMP 原始数据中看到的不同之处在于 exiftool 新创建了一个标头,而 Preview 没有。
例如,在没有元数据的 PNG 的维基百科页面上查看以下 PNG https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png:
使用 exiftool 添加关键字,然后转储 XMP 数据块:
exiftool -xmp-dc:subject=ViaExifSubject ./PNG_transparency_demonstration_1.png
exiftool -xmp -b ./PNG_transparency_demonstration_1.png
给出以下 XMP 数据:
<?xpacket begin='' id='W5M0MpCehiHzreSzNTczkc9d'?>
<x:xmpmeta xmlns:x='adobe:ns:meta/' x:xmptk='Image::ExifTool 9.02'>
<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
<rdf:Description rdf:about=''
xmlns:dc='http://purl.org/dc/elements/1.1/'>
<dc:subject>
<rdf:Bag>
<rdf:li>ViaExifSubject</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
<?xpacket end='r'?>
但是,在预览或 Finder 信息面板中,找不到“ViaExifSubject”。
或者,使用 OSX 预览添加评论(在预览中打开,显示检查器,转到关键字选项卡,单击“+”添加关键字)。XMP 通过 exiftool 再次转储:
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 5.1.2">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:subject>
<rdf:Bag>
<rdf:li>viaPreview</rdf:li>
</rdf:Bag>
</dc:subject>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
预览生成的xpacket
关键字中不存在标题,并且 XMP 工具包不同。“viaPreview”标签现在可见,例如mdls
在 CLI 上使用。
将原始 XMP 信息推送到一个干净的文件中也不会产生预期的结果:
exiftool "-xmp<=viaexif.xmp" PNG_transparency_demonstration_1.png
令人惊讶的是,如果我首先使用预览创建一个标签,然后执行上面的命令,新标签就会反映我怀疑我正在监督一个需要“激活”的外部数据解析器,拿起标签并将它们放在不同的存储(例如 .DS_store)。我没有看到任何 xattr 被添加。
这些是我的问题:
- exiftool 是 XMP/PNG 组合的正确工具吗,我是否缺少特定功能
- OSX 是否违反了 XMP 标准?编辑:显然 XMP在默认情况下不受 OSX 的尊重
- 我应该使用替代工具来剥离容器吗?
我在磁盘上挖掘了我的 xmp_sdk 并尝试了提供的示例:
ModifyXMP 可以将“纯”XMP 信息写入 OSX Finder 中显示的 PNG——这是一个很好的目标。
ReadingXMP 可以将 ExifTool 插入的 XMP 信息读取到 PNG 中,尽管此信息不会显示在 OSX Finder 中。
查看 ModifyXMP 的输出和 exiftool 插入完全相同的 XMP blob 时,文件大小相似。差异显示 exiftool 附加在 XMP sdk 将其放入 PNG 标头的文件末尾。XMP 规范声明“鼓励编码器将块放置在文件的开头,但这不是必需的。”
结论:exiftool 编写 XMP 的方式存在(轻微)差异,这特别会干扰 OSX 的元数据检索。
目前:
- 尝试使用 XMP SDK 在开头插入一个干净的 XMP 数据包,并让 exiftool 重用这个第一个块。
我在 exiftools 的论坛上转发,作者 Phil Harvey 回复:
我玩了一些Apple Preview,它不仅无法识别文件末尾的XMP,而且在向图像添加关键字时会删除此XMP。我的猜测是,如果 XMP 出现在 IDAT 块之后,Apple 软件会忽略它。如果 XMP 规范要求 XMP 块位于 IDAT 之前,那就太好了,但事实并非如此,因此这必须被视为 Apple 软件中的错误。我已将此添加到已知问题列表中。
最后,Phil Harvey 决定在 Exiftool 本身中解决这个问题:
我在这方面做了很多工作,Exiftool 9.40将有一个新选项允许您在 PNG IDAT 块之前编写 XMP。相应的命令将如下所示:
exiftool -api PNGEarlyXMP
...在 Apple 提交了一个错误——2014 年 12 月更新:Apple 关闭了我的错误,声明他们不会对此主题采取任何行动