Как записать теги людей WIC XMP в jpg?

У меня есть изображения с людьми, помечающими информацию в формате xml. Я хочу отредактировать эту информацию, а также добавить ее к фотографиям, на которых ее еще нет. Глядя на xml, я предполагаю, что он основан на теги людей, используемые в компоненте обработки изображений Microsoft.

Я не совсем понял формат, но я понял это очень далеко, что я могу изменить или гемерировать 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. Фотостанция поддерживает пометку людей на изображениях и использует данный формат. Мне нравится фотостанция во многих отношениях, но распознавание лиц плохое, поэтому я хочу использовать свою собственную, но чтобы фотостанция могла ее читать.


person findusl    schedule 31.05.2020    source источник
comment
Вам нужно заключить в кавычки часть с <, чтобы предотвратить перенаправление оболочки. Попробуйте exiftool "-xmp<=alteredXMP.txt" existingTags.JPG   -  person StarGeek    schedule 01.06.2020


Ответы (1)


Данные, которые вы пытаетесь записать, являются частью региональной структуры Microsoft. Структурированные данные XMP - это сложная тема, но вы должны иметь возможность добавлять данные с помощью 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 +=.

person StarGeek    schedule 01.06.2020