如何将 WIC XMP 人物标签写入 jpg?

How to write WIC XMP people tags to jpg?

我有 xml 格式的带有人物标记信息的图像。我希望编辑此信息并将其添加到还没有它的图片中。通过查看 xml 我假设它是基于 people tagging used in the microsoft imaging component.

我不太了解格式,但到目前为止我已经了解了,我可以更改或合并 xml,我只是不知道将其写在图像中的什么位置。我可能只是犯了一些愚蠢的错误,因为我对这些图像元数据没有经验。因此,如果您认为我走错了路,而且可以做得更简单,请告诉我。

在那些已经包含此 xml 的图像中,我可以使用搜索和替换来更新 xml。但是我有很多图片还没有包含这些信息,我不知道应该把它写到图片里面的什么地方。

已经包含此信息的图像可以使用 exiftool 读取,如下所示:

exiftool -xmp -b existingTags.JPG

结果如下xml:

<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP 
Core 4.4.0-Exiv2"> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" 
xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:MP="http://ns.microsoft.com/photo/1.2/" xmlns:MPRI="http://ns.microsoft.com/photo/1.2/t/RegionInfo#" 
xmlns:MPReg="http://ns.microsoft.com/photo/1.2/t/Region#" xmp:Rating="0"> <dc:subject> <rdf:Bag> <rdf:li>Valeriya
</rdf:li> </rdf:Bag> </dc:subject> <MP:RegionInfo rdf:parseType="Resource"> <MPRI:Regions> <rdf:Bag> <rdf:li 
MPReg:Rectangle="0.48, 0.418, 0.059333, 0.089" MPReg:PersonDisplayName="findus_l"/> </rdf:Bag> </MPRI:Regions> 
</MP:RegionInfo> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="w"?>

但是我无法使用exiftool 写入信息。当我运行这条命令时,它只是简单地再次读取信息,而不是将文件内容写入图像:

exiftool -xmp<=alteredXMP.txt existingTags.JPG

一些研究告诉我,exiftool 只能写特定的 xmp 标签,而来自 windows 成像组件的标记标签的人似乎不是其中的一部分。

我应该把信息写在图像文件的什么地方?我能以某种方式以编程方式找到这个位置,然后在其中插入 xml 吗?

我正在使用 Kotlin 作为编程语言,但我不介意调用命令行函数或其他程序。

背景:我有一个 Synology Diskstation 并使用名为 photo station 的附带软件。照片站支持在图像上标记人物并使用此给定格式。很多方面我都喜欢photo station,就是人脸识别不好,所以想用自己的photo station,但是有photo station可以读取。

您尝试写入的数据是 Microsoft Region Structure. XMP Structured data is a complex subject 的一部分,但您应该能够使用 exiftool 添加数据,方法是将区域名称写入 RegionPersonDisplayName 标记并将区域尺寸写入RegionRectangle。使用示例中的数据,命令为:
exiftool -RegionPersonDisplayName=findus_l -RegionRectangle="0.48, 0.418, 0.059333, 0.089" /path/to/files

如果要写多个区域,可以直接加,但是名称和匹配维度的顺序一定要保持一致。例如
exiftool -RegionPersonDisplayName=findus_l -RegionRectangle="0.48, 0.418, 0.059333, 0.089" -RegionPersonDisplayName="John Smith" -RegionRectangle="0.37645533, 0.04499886, 0.35111009, 0.26633097" /path/to/files

这些命令将覆盖任何现有的区域数据。如果您在不覆盖的情况下添加新名称,您可以将等号更改为 PlusEqual +=.