Python - добавить к изображению произвольные данные EXIF ​​(поле UserComment)? - PullRequest
0 голосов
/ 06 мая 2020

Мне нужно добавить произвольные данные к изображению JPEG. В частности, мне нужно сохранить два целых числа. Читая о данных EXIF, у меня сложилось впечатление, что невозможно создать свои собственные настраиваемые поля, вместо этого необходимо использовать стандартные поля EXIF.

Этот пост Пользовательские теги Exif однако упоминает поле UserComment, в которое, как я понимаю, можно записать строку. Если это единственный вариант, все в порядке, так как я могу сохранить два целых числа в строке с разделителями-запятыми, например '2,5', чтобы хранить целые числа 2 и 5, поэтому, если у меня есть только одна строка хранилища для работы, этого все равно достаточно .

Я загрузил несколько случайных изображений из поиска изображений Google и обнаружил, что у них, похоже, нет данных EXIF, возможно, они целенаправленно удалены Google? Также я сделал несколько изображений на свой мобильный телефон и обнаружил, что, как и ожидалось, они содержат значительный объем данных EXIF ​​(размер изображения, местоположение по GPS и т. Д. c.)

После некоторого поиска в Google я нашел этот пример на как читать / сбрасывать данные EXIF:

from PIL import Image

image = Image.open('image.jpg')
exifData = image._getexif()
print('exifData = ' + str(exifData))

Это отлично работает, если я запускаю это на изображении без данных EXIF, я получаю:

exifData = None

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

Теперь мой вопрос: как мне добавить данные EXIF? Используя поле UserComment 37510, упомянутое в приведенном выше сообщении, а также здесь https://www.awaresystems.be/imaging/tiff/tifftags/privateifd/exif/usercomment.html, и используя piexif, это моя лучшая попытка:

from PIL import Image
import piexif

image = Image.open('image.jpg')

exifData = image._getexif()

if exifData is None:
    exifData = {}
# end if

exifData[37510] = 'my message'

exifDataBytes = piexif.dump(exifData)

image.save('image_mod.jpg', format='jpeg', exif=exifDataBytes)

Если я тогда запустите 1-й код выше на image_mod.jpg. Я получаю:

exifData = {}

Итак, очевидно, что сообщение 37510 было написано неправильно. Я получаю тот же результат пустого словаря, независимо от того, использую ли я изображение с данными EXIF ​​или изображение без данных EXIF ​​для начала.

Прежде чем кто-то пометит это как дубликат, я также попробовал, что этот пост Как я могу вставить EXIF ​​/ другие метаданные в JPEG, хранящийся в буфере памяти? упоминается в ответе с наивысшей оценкой и получил тот же результат при попытке прочитать данные EXIF ​​(пустой словарь).

Что я делаю не так? Как правильно добавить пользовательские данные EXIF ​​к изображению с помощью 37510 или любого другого средства?

1 Ответ

0 голосов
/ 29 августа 2020

Вам не хватает шага в обработке данных, переданных на piexif.dump:

exif_ifd = {piexif.ExifIFD.UserComment: 'my message'}

exif_dict = {"0th": {}, "Exif": exif_ifd, "1st": {},
         "thumbnail": None, "GPS": {}}

exif_dat = piexif.dump(exif_dict)
img.save('image_mod.jpg',  exif=exif_dat)

После этого вы сможете прочитать их обратно. См. Также этот ответ для работы с настраиваемыми метаданными.

...