Мне нужно добавить произвольные данные к изображению 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 или любого другого средства?