Чтение данных XMP в Python
Можно ли использовать PIL, например, в этом примере?
Мне нужно только прочитать данные, и я ищу самый простой способ сделать это (я не могу установить pyexiv).
edit: Я не хочу верить, что единственный способ сделать это - с помощью некоторой библиотеки (python-xmp-toolkit, pyexiv2,...), которому нужны Exempi и Boost. Должен быть другой вариант!
Ответы
Ответ 1
Ну, я искал что-то подобное, тогда я наткнулся на эквивалентный PHP вопрос, и я перевел anwer на Python:
f = 'example.jpg'
fd = open(f)
d= fd.read()
xmp_start = d.find('<x:xmpmeta')
xmp_end = d.find('</x:xmpmeta')
xmp_str = d[xmp_start:xmp_end+12]
print(xmp_str)
вы можете преобразовать xmp_str и проанализировать его с помощью XML API.
Ответ 2
Метаданные XMP можно найти в applist
.
from PIL import Image
with Image.open(filename) as im:
for segment, content in im.applist:
marker, body = content.split('\x00', 1)
if segment == 'APP1' and marker == 'http://ns.adobe.com/xap/1.0/':
# parse the XML string with any method you like
print body
Ответ 3
Мне также интересно узнать, есть ли "правильный" простой способ сделать это.
В то же время я реализовал чтение XMP-пакетов с использованием чистого Python в PyAVM. Соответствующий код здесь. Может быть, это было бы полезно для вас?
Ответ 4
Поиск через источник PIL (1.1.7) говорит мне, что он может распознавать информацию XMP в файлах Tiff, но я не могу найти никаких доказательств документированного или недокументированного API для работы с информацией XMP с использованием PIL на уровне приложения.
Из файла CHANGES, включенного в исходный код:
+ Support for preserving ICC profiles (by Florian Böch via Tim Hatch).
Florian writes:
It a beta, so still needs some testing, but should allow you to:
- retain embedded ICC profiles when saving from/to JPEG, PNG, TIFF.
Existing code doesn't need to be changed.
- access embedded profiles in JPEG, PNG, PSD, TIFF.
It also includes patches for TIFF to retain IPTC, Photoshop and XMP
metadata when saving as TIFF again, read/write TIFF resolution
information correctly, and to correct inverted CMYK JPEG files.
Таким образом, поддержка XMP ограничена TIFF и только позволяет сохранять информацию XMP, когда загружается изображение TIFF, возможно, измененное и сохраненное. Приложение не может получить доступ или создать данные XMP.
Ответ 5
with open( imgFileName, "rb") as fin:
img = fin.read()
imgAsString=str(img)
xmp_start = imgAsString.find('<x:xmpmeta')
xmp_end = imgAsString.find('</x:xmpmeta')
if xmp_start != xmp_end:
xmpString = imgAsString[xmp_start:xmp_end+12]
xmpAsXML = BeautifulSoup( xmpString )
print(xmpAsXML.prettify())
Или вы можете использовать Python XMP Toolkit