import os | |
import uuid | |
from PIL import Image | |
from flask.ext.uploads import extension | |
def random_filename(): | |
"""生成伪随机uuid字符串,用做文件名""" | |
return str(uuid.uuid4()) | |
def process_image(file_storage, upload_set, max_border): | |
""" | |
将Flask中上传的图片进行居中裁剪、缩放,然后保存 | |
@param file_storage: Werkzeug FileStorage对象, 如request.files['image'] | |
@param upload_set: Flask-Uploads UploadSet对象 | |
@param max_border: 待缩放的边长 | |
@return: 图片filename | |
""" | |
# 打开图片 | |
image = Image.open(file_storage.stream) | |
# 居中裁剪 | |
w, h = image.size | |
if w > h: | |
border = h | |
crop_region = ((w - border) / 2, 0, (w + border) / 2, border) | |
else: | |
border = w | |
crop_region = (0, (h - border) / 2, border, (h + border) / 2) | |
image = image.crop(crop_region) | |
# 缩放 | |
if border > max_border: | |
image = image.resize((max_border, max_border), Image.ANTIALIAS) | |
# 保存 | |
ext = extension(file_storage.filename) | |
filename = '%s.%s' % (random_filename(), ext) | |
folder = upload_set.config.destination | |
filename = upload_set.resolve_conflict(folder, filename) | |
path = os.path.join(folder, filename) | |
image.save(path) | |
return filename |
1
rqrq 2013-12-14 22:59:22 +08:00
我觉得是不是应该先根据需要裁减的尺寸比例来缩图,然后再居中裁减多余的部分?
|
![]() |
4
dagger 2013-12-15 14:05:05 +08:00
用后缀名验证图片格式不靠谱吧,后缀名在前端作限制就可以了,让经办人直接来识别格式感觉更合适些:
try: image = Image.open(file_storage.stream) except IOError: ... 裁剪和缩放的活儿还是交给第三方吧 http://developers.aviary.com/ http://open.web.meitu.com/ 如果没法让用户通过交互操作来裁剪上传的图片,体验有可能会不好 |
![]() |
5
hustlzp OP @dagger 感谢推荐!后缀验证确实不靠谱。
http://developers.aviary.com/ 是个好东西,之前不知道哈... 可以用jcrop( http://deepliquid.com/content/Jcrop.html )实现交互。 |
![]() |
6
tokki 2013-12-15 15:53:30 +08:00
PIL 有一个方法叫ImageOps
就是切割图片的 |
![]() |
7
hustlzp OP |