Чтение данных XMP изображения в Python

Могу ли я использовать PIL, как в этот пример?

Мне нужно только прочитать данные, и я ищу самый простой способ сделать это (я не могу установить pyexiv) .

edit: Я не хочу верить, что единственный способ сделать это - использовать какую-нибудь библиотеку (python-xmp-toolkit, pyexiv2, ...), которому нужны Exempi и Boost. Должен быть другой вариант!


person dolma33    schedule 25.07.2011    source источник


Ответы (5)


Ну, я искал что-то подобное, потом наткнулся на эквивалент PHP, и я перевел ответ на 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.

person dirac3000    schedule 14.11.2011
comment
Мне нравится ... всегда были проблемы с усеченными ключевыми словами при использовании пакетов вроде PIL для доступа к данным. Еще одно преимущество заключается в том, что чтение его из jpg не приводит к зависимостям при написании многоразового пакета. - person sthzg; 29.03.2014
comment
Мне пришлось открыть с помощью 'rb', найти (b '‹x: xmpmeta') и найти ('b‹ /' x: xmpmeta '). Затем он творит чудеса, извлекая важные метаданные из изображений дронов DJI. - person Chris Sherwood; 01.11.2018
comment
XMP теперь может быть разбит на несколько отдельных частей, распределенных по файлу jpeg, условие, с которым это решение не справится. - person hippietrail; 23.07.2019

Метаданные 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
person CodeColorist    schedule 14.08.2015

Мне также интересно узнать, есть ли «правильный» простой способ сделать это.

Тем временем я реализовал чтение XMP-пакетов с использованием чистого Python в PyAVM. Соответствующий код находится здесь. Может быть, это было бы вам полезно?

person astrofrog    schedule 26.07.2011

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

person user1911091    schedule 31.01.2013
comment
Это сломается, когда XMP состоит из нескольких частей, из-за формата jpeg, разрешающего только 64 КБ для каждого фрагмента таких данных. - person hippietrail; 23.07.2019

Поиск в источнике 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's 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 или создать их.

person wberry    schedule 26.07.2011