python生成图片验证码

下面的代码是使用python生成图片验证码,然后结合flask,返回给前端显示。font_type指定字体路径,这里使用Mac原版字体Monaco.tar,运行程序,打开浏览器访问:localhost:18888/code/

#!/usr/bin/env python  
#coding=utf-8  
 
import random  
import Image, ImageDraw, ImageFont, ImageFilter  
import StringIO
 
from flask import Flask
 
#map:将str函数作用于后面序列的每一个元素
numbers = ''.join(map(str, range(10))) 
chars = ''.join((numbers))  
 
def create_validate_code(size=(120, 30),  
                         chars=chars,  
                         mode="RGB",  
                         bg_color=(255, 255, 255),  
                         fg_color=(255, 0, 0),  
                         font_size=18,  
                         font_type="Monaco.ttf",  
                         length=4,  
                         draw_points=True,  
                         point_chance = 2):  
    ''''' 
    size: 图片的大小,格式(宽,高),默认为(120, 30) 
    chars: 允许的字符集合,格式字符串 
    mode: 图片模式,默认为RGB 
    bg_color: 背景颜色,默认为白色 
    fg_color: 前景色,验证码字符颜色 
    font_size: 验证码字体大小 
    font_type: 验证码字体,默认为 Monaco.ttf 
    length: 验证码字符个数 
    draw_points: 是否画干扰点 
    point_chance: 干扰点出现的概率,大小范围[0, 50] 
    ''' 
 
    width, height = size  
    img = Image.new(mode, size, bg_color) # 创建图形  
    draw = ImageDraw.Draw(img) # 创建画笔  
 
    def get_chars():  
        '''''生成给定长度的字符串,返回列表格式''' 
        return random.sample(chars, length)  
 
    def create_points():  
        '''''绘制干扰点''' 
        chance = min(50, max(0, int(point_chance))) # 大小限制在[0, 50]  
 
        for w in xrange(width):  
            for h in xrange(height):  
                tmp = random.randint(0, 50)  
                if tmp > 50 - chance:  
                    draw.point((w, h), fill=(0, 0, 0))  
 
    def create_strs():  
        '''''绘制验证码字符''' 
        c_chars = get_chars()  
        strs = '%s' % ''.join(c_chars)  
 
        font = ImageFont.truetype(font_type, font_size)  
        font_width, font_height = font.getsize(strs)  
 
        draw.text(((width - font_width) / 3, (height - font_height) / 4),  
                    strs, font=font, fill=fg_color)  
 
        return strs  
 
    if draw_points:  
        create_points()  
    strs = create_strs()  
 
    # 图形扭曲参数  
    params = [1 - float(random.randint(1, 2)) / 100,  
              0,  
              0,  
              0,  
              1 - float(random.randint(1, 10)) / 100,  
              float(random.randint(1, 2)) / 500,  
              0.001,  
              float(random.randint(1, 2)) / 500 
              ]  
    img = img.transform(size, Image.PERSPECTIVE, params) # 创建扭曲  
 
    img = img.filter(ImageFilter.EDGE_ENHANCE_MORE) # 滤镜,边界加强(阈值更大)  
 
    return img,strs  
 
app = Flask(__name__)  
 
@app.route('/')  
def index():  
    return 'test' 
 
@app.route('/code/')  
def get_code():  
    #把strs发给前端,或者在后台使用session保存  
    code_img,strs = create_validate_code()  
    buf = StringIO.StringIO()  
    code_img.save(buf,'JPEG',quality=70)  
 
    buf_str = buf.getvalue()  
    response = app.make_response(buf_str)   
    response.headers['Content-Type'] = 'image/jpeg'  
    return response   
 
if __name__ == "__main__":  
    app.run(host="localhost",port=18888,debug=True)

转载请注明来自: Alex Zhou ,本文链接: http://codingnow.cn/python/627.html

你可能感兴趣的:(python生成图片验证码)