使用PIL压缩图像并保存到zip文件中

2017/6/26 自动化测试PIL

在自动化测试中经常会使用邮件发送执行结果和日志文件,如果日志中存在大量图像文件,往往会因为邮件附件太大,被邮件服务器拒绝发送。这时往往需要通过压缩文件来解决,下面介绍使用zipfile和PIL库压缩文件和图像的方法。

# PIL的使用

from PIL import Image

im = Image.open('text.jpg')
w,h = im.size
im.resize((int(w/2), int(h/2)),Image.ANTIALIAS).save('text1.jpg', "jpeg")

上文代码解析如下:

  • Image.open('text.jpg'):打开图像文件,该方法返回Image对象
  • im.size:获取图像当前的大小
  • im.resize((int(w/2), int(h/2)),Image.ANTIALIAS):压缩图像大小为原来的一半,可以改变(int(w/2), int(h/2))去改变压缩比;Image.ANTIALIAS参数为压缩的方法,一般使用这个值即可,此值为最佳画质。
  • save('text1.jpg', "jpeg"):保存新图像到test1.jpg文件中

# zipfile的使用

import zipfile

with zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED) as f:
    f.write('test.html')

代码解析:

  • zipfile.ZIP_DEFLATED:压缩模式,具体可以看帮助文档
  • f.write('test.html'):将文件test.html写入压缩文档

# PIL和zipfile组合使用

import zipfile

from PIL import Image

with zipfile.ZipFile('test.zip', 'w', zipfile.ZIP_DEFLATED) as f:

    im_io = io.BytesIO()
    im_p = 'test.img'
    im = Image.open(im_p)
    w,h = im.size
    im.resize((int(w/2), int(h/2)),Image.ANTIALIAS).save(im_io, "jpeg")
    f.writestr(im_p,im_io.getvalue())

代码解析:

  • 此段代码主要作用是在不改变原图像大小的情况下,将压缩到一半大小的图像写入压缩文件。
  • im_io = io.BytesIO():获取一个IO流文件,主要用来缓存压缩的图像
  • f.writestr(im_p,im_io.getvalue()):将数据流写入压缩文件,这里使用的是writestr。

# 其它

如果压缩比很是不够可以通过img.convert('L')改变灰度模式进一步减少大小。