Как изменить название модели камеры изображения с помощью Python

Я пытался изменить название модели камеры с помощью библиотеки PIL и piexif для Python. Это была успешная попытка, но когда я проверил изображения, размер изображения уменьшился с 8-9 МБ до 1-2 МБ.

Как я могу изменить данные exif без изменения размера изображения?

Мой код следующий:

img = Image.open(image_)
exif_dict = piexif.load(img.info['exif'])
exif_dict = piexif.load(image)

#new camera model name
exif_dict['0th'][272] = b'new_camera_model_name'

# Converting to bytes
exif_bytes = piexif.dump(exif_dict)

#Saving Image
img.save(image, exif=exif_bytes)

1 ответ

На самом деле вы не можете достичь поставленной цели так, как вы поступаете. Вы читаете изображение, написанное какой-то другой, неизвестной библиотекой JPEG, и записываете его, возможно, используя другое значение качества с библиотекой JPEG, которую PIL использует под обложками. Стандарт JPEG позволяет кодерам / декодерам изображений использовать разные уровни точности и делать различные компромиссы между точностью, размером изображения и скоростью, поэтому маловероятно, что 2 кодера JPEG дадут один и тот же результат - даже разные версии одной и той же библиотеки могут кодировать по-другому.

Итак, если вы действительно хотите изменить свои метаданные без изменения качества изображения, вам будет лучше использовать такой инструмент, как exiftoolкоторый не декодирует и не перекодирует ваши данные. В командной строке вы должны использовать:

exiftool -Model='My Funky Camera' image.jpg

Затем вы можете увидеть новую настройку с помощью:

exiftool image.jpg

ExifTool Version Number         : 11.11
File Name                       : image.jpg
Directory                       : .
File Size                       : 105 kB
File Modification Date/Time     : 2019:10:23 12:54:34+01:00
File Access Date/Time           : 2019:10:23 12:54:35+01:00
File Inode Change Date/Time     : 2019:10:23 12:54:34+01:00
File Permissions                : rw-r--r--
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Exif Byte Order                 : Big-endian (Motorola, MM)
Camera Model Name               : My Funky Camera              <--- HERE IT IS
X Resolution                    : 1
Y Resolution                    : 1
Resolution Unit                 : None
...
...
Megapixels                      : 1.6

Есть привязка к Python, но лично я бы просто использовал Python subprocessс помощью обычного инструмента командной строки. YMMV.

Другие вопросы по тегам