如何使用PIL缩放图像时保留Exif数据?

6
当我使用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个回答

5
注意:我自己还没有尝试过,但据我所知,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

顺便说一下:感谢您提出这个有趣的问题!


1
听起来不错,我尝试了pyexiv2 https://dev59.com/mmQn5IYBdhLWcg3wLkgd#17059383,但我需要使用imagebuffer。 - Jisson
我安装了gexiv2,并且可以编辑exif数据,但是如何编辑内存中的字符串图像的exif呢?例如:im.save(thumbnail_buf_string, format=file_save_extension) - Jisson
你是正确的,有没有办法在不将第二个图像保存到磁盘的情况下,将原始图像的exif数据设置为调整大小后的图像?这意味着将exif设置为调整大小后的图像实例本身。如果不可能,我认为按照你建议的方式做是唯一的方法,谢谢。 - Jisson
你说得对,在内存中完成所有操作会很好。不幸的是,我还没有找到是否可能以及如何实现它。 - Klaus-Dieter Warzecha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接