Как записать данные EXIF ​​в файлы JPG с помощью модуля Python PIL?Python

Программы на Python
Ответить
Anonymous
 Как записать данные EXIF ​​в файлы JPG с помощью модуля Python PIL?

Сообщение Anonymous »

Используя PIL.Image версии 7.0.0 с Python 3.8 в Ubuntu 20.04, я столкнулся с проблемой при записи данных EXIF ​​в новый файл.

Я пытаюсь использовать (возможно, слегка измененные) EXIF-данные (т. е. тег 306 «DateTime») для записи нового файла jpg. Однако при чтении данных EXIF ​​из нового файла возникают проблемы из-за явно неправильных дополненных данных. Посмотрите это:
Оригинальные теги:

Код: Выделить всё

36867 : DateTimeOriginal            : 2003:01:12 03:04:15
36868 : DateTimeDigitized           : 2003:01:12 03:04:15
306 : DateTime                    : 2003:01:12 03:04:15
Теги нового файла (использованы данные EXIF ​​без изменений):

Код: Выделить всё

36867 : DateTimeOriginal            : 3:04:152003:01:12 0
36868 : DateTimeDigitized           : 3:04:152003:01:12 0
306 : DateTime                    : ´2003:01:12 0
Можно увидеть, что отсутствующий хвост «3:04:14» тега 306 появляется в других тегах в качестве префикса. Такое поведение происходит с JPG-файлами из разных источников.
Весь тестовый код, который я использую, выглядит следующим образом:

Код: Выделить всё

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import PIL.Image
import PIL.ExifTags

def fingerExifAndSave(source,target):
im=PIL.Image.open(source)
imexif=im.getexif()

if False :  # False True
print("Change tag 306 (DateTime) to something wired for debugging")
imexif[306] = 'abcdefghijklmnopqrs'     # tag 306 means "DateTime"
imexif[306] = '2066:55:44 33:22:11'
print("   Tag 306 is now set to :",imexif[306] )
else:
print("NO MODIFICATION TO TAG 306 ('DateTime')!")

# Due to "/usr/lib/p*3/dist*/PIL/TiffImagePlugin.py:588: UserWarning: \
#     Metadata Warning, tag 282 had too many entries: 2, expected 1 "
if False :  # False True
print("Repairing something for some unknown reason due to warning")
for r in (282,283):  imexif[r]= imexif[r][0]
else:
print("NO REAPIRING TO TAGS (282,283)!")

rc=im.save(target, exif=imexif) # Save using the optionally modified EXIF
print("Image written to:",target,"  with rc =",rc )
im.close()
imexif=None

def showSomeExifTags(myfile):
showThisTags=[306,36867,36868,305]  # 'DateTime'-entries and 'Software'
im=PIL.Image.open(myfile)
imexif=im.getexif()
print("\nSome EXIF-tags from '"+myfile+"' (among other):")
print("KeyNr : KeyName"+" "*21+": Value")
for k,v in imexif.items():
if k in showThisTags:
if len(str(v)) > 30 : v=str(v[0:20])+"..."  # keep it smooth
print(f"{k:>5} : {PIL.ExifTags.TAGS[k]:27} : {v}")
im.close()
print()

def main():
source="./orig2.jpg"   # "./orig2.jpg"
target="./modified.jpg"
print ("PIL.Image.__version__  in use:",PIL.Image.__version__)
showSomeExifTags(source)
fingerExifAndSave(source,target)
showSomeExifTags(target)

if __name__ == "__main__":
main()
Я делаю что-то не так? Если да, то как это сделать правильно?
Есть ли известная ошибка, которую я пропустил при поиске в Интернете?
Как обойти эту проблему?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»