使用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')改变灰度模式进一步减少大小。