仝 tóng

Pillow 读取和保存EXIF信息至图片

在上一篇文章中“Python+PIL(Pillow)批量设置图片大小和添加水印”,虽然将图片保存了,但图片的EXIF信息则没有了,然后在网上找关于如何将原图片的exif信息保存至新图片中,经过一晚上的查找,终于实现了这个功能,同样是在Python+pillow的基础上,我们需要一个新的插件,名叫“piexif” 。

注意:Pillow尚无法读取.png后缀图片的exif信息,现只能读取.jpg图片的exif信息。

1.首先是如何读取图片的EXIF信息:

from PIL import Image
from PIL.ExifTags import TAGS

def get_exif():
  i = Image.open('/path/to/imagefile.jpg')
  info = i._getexif()
  return {TAGS.get(tag): value for tag, value in info.items()}

print get_exif()

上面的解决方案来自stackoverflow,这个方法还是比较简单的。

另外提供一种方法,来自DeveloperQ

import PIL.Image
img = PIL.Image.open('img.jpg')
exif_data = img._getexif()
import PIL.ExifTags
exif = {
    PIL.ExifTags.TAGS[k]: v
    for k, v in img._getexif().items()
    if k in PIL.ExifTags.TAGS
}
print exif

2.下面介绍使用piexif这个插件将原图的exif保存至用pil设置后的新图片:

$ pip install piexif     //首先要在terminal中安装piexif

from PIL import Image
import piexif
im = Image.open(filename)
exif_dict = piexif.load(im.info["exif"])
# process im and exif_dict...
w, h = im.size
exif_dict["0th"][piexif.ImageIFD.XResolution] = (w, 1)
exif_dict["0th"][piexif.ImageIFD.YResolution] = (h, 1)
exif_bytes = piexif.dump(exif_dict)
im.save(new_file, "jpeg", exif=exif_bytes)

上面这段代码可以在piexif guide章节5.1中找到。

下面用我的脚本做个例子:

from PIL import Image
import glob, os, piexif

#size = (900, 900)
wsize = 90, 40

for f in os.listdir('.'):
    if f.endswith('.jpg'):
        i = Image.open(f)
        w = Image.open('tonglei.png')      #//watermark image
        exif_dict = piexif.load(i.info["exif"])  #//start piexif
        exif_bytes = piexif.dump(exif_dict)  #//only need two line of it
        fn, fext = os.path.splitext(f)

        i.thumbnail(tuple(size//3 for size in i.size))
        w.thumbnail(wsize)
        i.paste(w, None, w)
        i.save('pngs/{}.jpg'.format(fn, fext), exif=exif_bytes, quality=95, optimize=True) #//Save

通过上面的例子看到只需要两行就可以完成,尤其注意保存图片的时候后缀必须是.jpg,.png不支持exif信息,当然.jpg会比.png大小小5倍以上,图片但有一些比原图颜色失真一些,如不仔细看是发现不了的,暂时尚未找到解决办法。

exif.png

exif1.png

发表新评论