下面的代码是使用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)

 

lua面向对象模拟简介

lua不是面向对象语言,但可以通过表(table)和元表(metatable)来模拟。table 是 lua 中唯一的一种数据结构,它可以用来描述原始的数组、符号表、集合、 记录、...

阅读全文

在c/c++中调用lua函数

上篇文章完成了在lua中调用c/c++函数,现在来实现在c/c++中调用lua函数。 首先完成lua代码,创建sum.lua: function add(x, y) return x + y; end 为了...

阅读全文

在lua中调用c/c++函数

lua是一种轻量级的脚本语言,用来扩展c和c++非常好,在游戏开发中使用很普遍。 首先下载lua,因为我是在win7下,所以我这里下载了luaforwindows,安装到F:\Lu...

阅读全文

2 条评论

欢迎留言