最近在做小脚丫 https://bbttxs.com 应用,在使用 PIL image 处理用户上传的图片做头像时出现一些质量的问题,处理后的头像100x100,太差了。
在使用PIL image处理图像要获取高质量的关键地方是下面两点:
- 处理时要用 ANTIALIAS;
- 保存时是要设置 quality;
在python ide 可以这样处理:
1
2
im.resize(box, Image.ANTIALIAS)
im.save(path, 'JPEG', quality = 95)
但在SAE 环境里需要借助 StringIO
,下面开始做一个简单的实例:
前端html 代码
1
2
3
4
<form action="" enctype="multipart/form-data" method="post">
<input name="myfile" type="file">
<input type="submit" value="Submit">
</form>
后台处理代码
导入需要的模块
1
2
from StringIO import StringIO
from PIL import Image
获取表单提交的数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#我用Tornado,别的框架这里有点差别
myfile = self.request.files['myfile'][0]
im = Image.open(StringIO(myfile['body']))
im = im.resize((100,100), Image.ANTIALIAS)
#下面一行简单方便,但生成的图片质量很差,头像惨不忍睹
#img_data = im.tostring('jpeg', 'RGB')
#下面是获取要显示或保存的图像数据
output = StringIO()
im.save(output, 'JPEG', quality = 95)
img_data = output.getvalue()
output.close()
#在浏览器现实图片
self.set_header('Content-Type','image/jpeg')
self.write(img_data)
你也可以保存为png 格式
1
im.save(output, 'PNG')
关于保存格式和质量的测试
我是要生成100x100px 的头像,色彩模式RGB,用jpeg格式,下面是不同的quality 值对应的图像大小
1
2
3
4
5
6
quality = 50, size = 3.15 k
quality = 60, size = 3.52 k
quality = 80, size = 5.21 k
quality = 90, size = 6.30 k
quality = 95, size = 7.37 k
quality = 100, size = 13.18 k
如果用png 格式则生成23.50k的文件
作为头像设为95较合适,低于95的就不好看。如果你为了用户体验,不省空间和流量那就用png吧。
注意,如果上传gif文件则要加上 .convert('RGB')
转换
1
im.convert('RGB').save(output, 'JPEG', quality = 95)
本文网址: https://pylist.com/topic/19.html 转摘请注明来源