在SAE python上使用PIL image 获取较高质量图片的方法

最近在做小脚丫 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 转摘请注明来源

Suggested Topics

SAE+python+Tornado+pyTenjin 的完整示例

python 简单易懂,Tornado 高效易学,pyTenjin 轻巧快速,SAE 安全稳定使用门槛低。现在把他们结合在一起做了一个可运行在SAE 上的完整示例。...

SAE Python上开启gzip的方法

开启 gzip 的作用自不必说,可以省很多流出带宽,可以省很多云豆。昨天这个博客的云豆消耗,其中流出带宽就占九成多,开启后就会只占五成多。...

Leave a Comment