Как изменить название модели камеры изображения с помощью 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.