使用Exiftool在PNG图像中创建可见的OSX XMP元数据

9

在我的图像处理软件周围,我使用exiftool成功地从Cr2、TIFF和JPG文件中整理出exif信息。添加的标签,如“关键字”,在OSX(山狮)Finder、Preview中都是可见的,并且被Spotlight很好地索引。

对于PNG,我需要回退到XMP,因为这是PNG的元数据容器。然而,exiftool添加的标签似乎既不能被Preview也不能被SpotLight捕获。相比之下,如果我先在Preview中添加一个标签,然后再使用exiftool添加一个新的标签,这个标签就会被索引。这里我看到的区别是XMP原始数据中exiftool新创建了一个标头,而Preview没有。

例如,看看维基百科上没有元数据的PNG页面上的以下PNG:https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png

无元数据示例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预览添加注释的方法是(在预览中打开,显示检查器,转到关键字选项卡,点击“+”添加关键字)。然后通过exiftool再次转储XMP。
<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”标记,例如在CLI上使用mdls

将原始XMP信息推入干净文件中也没有得到预期结果:

exiftool "-xmp<=viaexif.xmp" PNG_transparency_demonstration_1.png

令人惊讶的是,如果我先使用预览创建标签,然后执行上述命令,则会反映出新标签。我怀疑我忽略了需要“激活”的外部数据解析器,它会捕捉标签并将它们放入不同的存储区域(例如.DS_store)。我没有看到任何添加xattr。

以下是我的问题:

  • exiftool是否是处理XMP/PNG组合的正确工具,并且我是否缺少特定功能?
  • OSX是否违反了XMP标准?编辑:显然,默认情况下OSX不尊重XMP
  • 我是否应该调查另一种去除容器的工具?

我在磁盘中找到了我的xmp_sdk并尝试了提供的示例:

ModifyXMP可以将“纯”XMP信息写入PNG,这在OSX Finder中显示--这是一个很好的目标。

ReadingXMP可以读取ExifTool插入PNG的XMP信息,尽管此信息在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关闭了我的错误报告,称他们不会对此问题采取任何行动

2个回答

0

Preview.app 现在与

已经可以完美地配合使用。
exiftool -xmp-dc:subject=ViaExifSubject 

0
  1. 您可以尝试使用XMP Toolkit SDK及其示例,为PNG编写元数据。
  2. OSX使用IPTC(不确定,在某处读到)和XMP工具包确实会协调XMP和IPTC,因此使用XMP Toolkit添加的关键字将在OS X上可搜索。

从您的观察中看来,它似乎没有协调IPTC和XMP。您可以尝试更改PNG内部的IPTC和XMP,看看是否可以进行搜索。


我编辑了帖子,包括XMP SDK的行为。我认为这里不需要IPTC(在PNG中不直接支持)。 - gdh
我会给你点赞,因为你选择了使用XMP SDK路线,从而触发了在PNG中找到XMP数据包顺序的发现——我们将看到这最终会带来什么结果。 - gdh

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