Как сохранить exif данные изображений изменяет размер с помощью PIL

Когда я пытаюсь изменить размер (миниатюру) изображения, используя PIL, он уничтожает exif-данные, связанные с изображением. Как я могу сохранить его?

Я изменяю размер изображения и загружаю его в облако в качестве буфера изображения.

file_path = '...'
file_name = '...'
im = Image.open( file_path )
size =(512,521)
im.thumbnail( size, Image.ANTIALIAS)
thumbnail_buf_string = StringIO.StringIO()
file_save_extension = 'JPEG'
im.save(thumbnail_buf_string, format=file_save_extension)
upload_to_cloud('512_' + file_name , thumbnail_buf_string.getvalue())

Изображение с измененным размером не имеет данных exif.

1 ответ

Решение

Примечание: я сам еще этого не делал, но, насколько мне известно, PIL позволяет только читать теги exif, но не может их записывать. Вам, вероятно, понадобится gexiv2 или pyexiv2, чтобы написать теги для ваших миниатюр.

ОБНОВЛЕНИЕ: Мне стало любопытно, и я попробовал это сам: D Если я правильно понял, вы просто хотите скопировать метаданные без дальнейших изменений.

Это все еще грубо, но, кажется, работает:

import os
import Image
import pyexiv2

fp = '/home/klaus/workspace'
fn = 'img_2380.jpg'

full_path = os.path.join(fp, fn)
print full_path

im = Image.open(full_path)
size = 512, 512
im.thumbnail(size, Image.ANTIALIAS)
im.save('bla.jpg', 'JPEG')

oldmeta = pyexiv2.ImageMetadata(full_path)
oldmeta.read()
# read metadata of the original file

newmeta = pyexiv2.ImageMetadata('bla.jpg')
newmeta.read()
# read metadata of the new file
# yes, there aren't any, but this is crucial!
# you need this class as the target for copying!

oldmeta.copy(newmeta)

newmeta.write()
# don't forget to write the data to the new file

Кстати, спасибо за интересный вопрос!

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