Тегирование изображений XMP и Python

Если бы я пометил кучу изображений через XMP в Python, что было бы лучше всего? Я использовал Perl Image :: ExifTool и очень привык к его надежности. Я имею в виду то, что никогда не использовалось на десятках тысяч изображений.

Я нашел это, поддержанный некоторыми крупными нападающими, такими как Европейское космическое агентство , но он явно отмечен как нестабильный.

Теперь, при условии, что я хорошо знаком с C ++, насколько легко, скажем, использовать набор инструментов Adobe XMP напрямую, в Python? Я никогда не делал этого раньше, поэтому не знаю, на что я бы подписался.

Обновление: я пробовал некоторые библиотеки, и, включая вышеупомянутый инструментарий, они все еще довольно незрелые и имеют явные проблемы. Я прибег к написанию сервера на основе Perl, который принимает XML-запросы на чтение и запись метаданных, с протестированным в боевых условиях Image :: EXIF. Объем кода на самом деле очень невелик, и он определенно лучше, чем мучить себя, пытаясь заставить библиотеки Python работать. Серверное решение не зависит от языка, поэтому оно двоякое.


person Andrei Taranchenko    schedule 01.02.2009    source источник


Ответы (5)


Что ж, на их веб-сайте говорится, что python-xmp-toolkit использует Exempi, который основан на наборе инструментов Adobe XMP, через ctypes. Я пытаюсь сказать, что вы вряд ли сами создадите лучшую оболочку для кода C ++. Если он нестабилен (т. Е. Содержит ошибки), вам, скорее всего, будет дешевле создавать патчи, чем делать это самостоятельно с нуля.

Однако в вашей особой ситуации это зависит от того, какая функциональность вам нужна. Если вам нужна всего лишь одна функция, то можно обернуть код C ++ в небольшую библиотеку расширений C или с помощью Cython. Когда вам нужно иметь всю функциональность и гибкость, вам нужно создавать оболочки вручную или с помощью SWIG, в основном повторяя работу, уже проделанную другими людьми.

person Torsten Marek    schedule 01.02.2009
comment
Да, я определенно не хочу конкурировать с Европейским космическим агентством :), но мне интересно, может ли это ярлык для прямого использования инструментария Adobe. Мои цели ОЧЕНЬ ограничены. Просто напишите несколько простых тегов - никаких изысков. - person Andrei Taranchenko; 01.02.2009
comment
В этом случае я бы сказал просто написать небольшой модуль расширения. - person Torsten Marek; 01.02.2009
comment
@Torsten или просто попробуйте python-xmp-toolkit. unstable расплывчат, и он, вероятно, сделает то, что ему нужно. единственный способ узнать это - попробовать .. - person Daniel Naab; 01.02.2009
comment
Если вы собираете Exempi на MAC, вы - SOL, так как ни одна из работающих сборок (macports, brew) не устанавливает модули, необходимые для ctypes. - person Dan Osipov; 07.06.2013

Я несколько часов боролся с python-xmp-toolkit, и в конце концов сдался и просто обернул вызовы на ExifTool.

Существует библиотека Ruby, которая также обертывает ExifTool (хотя и намного лучше, чем то, что я создал); Я считаю, что стоит перенести его на Python, чтобы упростить работу с XMP.

person Xiong Chiamiov    schedule 13.09.2010

Для Python 3.x существует py3exiv2, который поддерживает редактирование метаданных XMP.

С помощью py3exiv2 вы можете читать и записывать все стандартные метаданные, создавать собственное пространство имен XMP или извлекать миниатюру, встроенную в файл изображения.

В py3exiv2 мне нравится то, что он построен на (C ++) библиотеке exiv2, которая кажется хорошо обслуживаемой.

Однако я столкнулся с проблемой при его установке в моей системе (Ubuntu 16.04). Чтобы он заработал, мне сначала пришлось установить последнюю версию libexiv2-dev (sudo apt-get install libexiv2-dev), и только после этого установить py3exiv2 (sudo -H pip3 install py3exiv2)

Вот как я использовал py3exiv2 для написания нового тега:

import pyexiv2
metadata = pyexiv2.ImageMetadata("file_name.jpg")
metadata.read()
key = "Xmp.xmp.CustomTagKey"
value = "CustomTagValue"
metadata[key] = pyexiv2.XmpTag(key, value)
metadata.write()

(В документации также есть руководство)

person sunyata    schedule 05.08.2017
comment
Спасибо за инструкцию по установке. Очень полезно. - person Nairum; 18.01.2021

Для тех, кто найдет эту ветку в будущем, я хотел бы поделиться своим решением. Я поместил пакет в индекс пакетов Python (PyPI) под названием imgtag. Он позволяет вам выполнять базовые Редактирование тега поля темы XMP с использованием python-xmp-toolkit, но абстрагирует всю досадную чепуху фактического использования python-xmp-toolkit в однострочные команды.

Установите exempi для своей платформы, затем запустите

python3 -m pip install imgtag

Теперь вы можете использовать это как таковое:

from imgtag import ImgTag

# Open image for tag editing
test = ImgTag(
           filename="test.jpg", # The image file
           force_case="lower",  # Converts the case of all tags
                                # Can be `None`, `"lower"`, `"upper"`
                                # Default: None
           strip=True,          # Strips whitespace from the ends of all tags
                                # Default: True
           no_duplicates=True   # Removes all duplicate tags (case sensitive)
                                # Default: True
       )

# Print existing tags
print("Current tags:")
for tag in test.get_tags():
    print("  Tag:", tag)

# Add tags
test.add_tags(["sleepy", "happy"])

# Remove tags
test.remove_tags(["cute"])

# Set tags, removing all existing tags
test.set_tags(["dog", "good boy"])

# Save changes and close file
test.close()

# Re-open for tag editing
test.open()

# Remove all tags
test.clear_tags()

# Delete the ImgTag object, automatically saving and closing the file
del(test)

Я еще не добавил методы для других полей XMP, таких как описание, дата, создатель и т. Д. Возможно, когда-нибудь я добавлю, но если вы посмотрите, как работают существующие функции, в исходном коде, вы, вероятно, сможете выяснить, как добавить метод самостоятельно. Если вы все же добавляете другие методы, сделайте запрос на перенос. :)

person Ella Jameson    schedule 01.10.2020

Вы можете использовать ImageMagic convert, IIRC также есть модуль Python для него.

person lazy1    schedule 04.02.2009