web.py上传图片 and PIL 生成缩略图

1、上传图片

1.1、前台模板:

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

1.2、上传图片:


x = web.input(myfile={})
if 'myfile' in x:
    filepath=x.myfile.filename.replace('\\','/')                                       #客户端为windows时注意
    filename=filepath.split('/')[-1]                                                           #获取文件名
    ext = filename.split('.', 1)[1]                                                              #获取后缀
    if ext == 'jpg':                                                                                       #判断文件后缀名
        homedir = os.getcwd()
        filedir = '%s/static/upload' %homedir #要上传的路径
        now=datetime.now()
        t ="%d%d%d%d%d%d" %(now.year,now.month,now.day,now.hour,now.minute,now.second) #以时间作为文件名
        filename = t+'.'+ext
        fout = open(filedir +'/'+ filename,'w')
        fout.write(x.myfile.file.read())
        fout.close()
        message = u'OK!'
        error = False
    else:
        message = u'请上传jpg格式的文件!'
        error = True

2、生成缩略图

2.1、首先需要安装Python Imaging Library (PIL)
2.2、代码:


def make_thumb(path, sizes=[(98,80),(150,120)]):
    """
    sizes 参数传递要生成的尺寸,可以生成多种尺寸
    """
    base, ext = os.path.splitext(path)
    try:
        im = Image.open(path)
    except IOError:
print ' in  IOError'
        return
    mode = im.mode
    if mode not in ('L', 'RGB'):
        if mode == 'RGBA':
            # 透明图片需要加白色底
            alpha = im.split()[3]
            bgmask = alpha.point(lambda x: 255-x)
            im = im.convert('RGB')
            # paste(color, box, mask)
            im.paste((255,255,255), None, bgmask)
        else:
            im = im.convert('RGB')

    width, height = im.size
    if width == height:
        region = im
    else:
        if width &gt; height:
            delta = (width - height)/2
            box = (delta, 0, delta+height, height)
        else:
            delta = (height - width)/2
            box = (0, delta, width, delta+width)
        region = im.crop(box)

    for size in sizes:
        filename = base + "_" + "%sx%s" % (str(size[0]), str(size[1])) + ".jpg"
        thumb = region.resize((size[0],size[1]), Image.ANTIALIAS)
        thumb.save(filename, quality=100) # 默认 JPEG 保存质量是 75, 不太清楚。可选值(0~100)


2.3、上传图片完毕后调用本方法就可以。


    fout.write(x.myfile.file.read())
    fout.close()
    util.make_thumb(filedir + filename)


2.4、size为可选参数,是数组列表,数组列表种有几个值则会生成几个缩略图。本例中会生成两张。如果自己需要更改则在方法中传一个数组列表就可以了。
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。