pyList

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

最近在做小脚丫 https://bbttxs.com 7 应用,在使用 PIL image 处理用户上传的图片做头像时出现一些质量的问题,处理后的头像100x100,太差了。

较高质量图片

在使用PIL image处理图像要获取高质量的关键地方是下面两点:

  • 处理时要用 ANTIALIAS;
  • 保存时是要设置 quality;

在python ide 可以这样处理:

im.resize(box, Image.ANTIALIAS)
im.save(path, 'JPEG', quality = 95)

但在SAE 环境里需要借助 StringIO,下面开始做一个简单的实例:

前端html 代码

<form action="" enctype="multipart/form-data" method="post">
<input name="myfile" type="file">
<input type="submit" value="Submit">
</form>

后台处理代码

导入需要的模块

from StringIO import StringIO
from PIL import Image

获取表单提交的数据

#我用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 格式

im.save(output, 'PNG')

关于保存格式和质量的测试

我是要生成100x100px 的头像,色彩模式RGB,用jpeg格式,下面是不同的quality 值对应的图像大小

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') 转换

im.convert('RGB').save(output, 'JPEG', quality = 95)
本文标签: python SAE PIL image 高质量
本文网址: https://pylist.com/t/1332497678 (转载注明出处)
如果你有任何建议或疑问可以在下面 留言
发表第一条评论!
验证码图片
相关推荐