您好,欢迎访问一九零五行业门户网

python图片验证码生成代码

本文实例为大家分享了python图片验证码实现代码,供大家参考,具体内容如下
#!/usr/bin/env python# -*- coding: utf-8 -*- import randomfrom pil import image, imagedraw, imagefont, imagefilter try: import cstringio as stringioexcept importerror: import stringio _letter_cases = abcdefghjkmnpqrstuvwxy # 小写字母_upper_cases = abcdefghjklmnpqrstuvwxy # 大写字母_numbers = 1234567890 # 数字init_chars = ''.join((_letter_cases, _upper_cases, _numbers)) # 生成允许的字符集合default_font = ./dejavusans.ttf # 验证码字体 # 生成验证码接口def generate_verify_image(size=(120, 30), chars=init_chars, img_type=gif, mode=rgb, bg_color=(255, 255, 255), fg_color=(0, 0, 255), font_size=18, font_type=default_font, length=4, draw_lines=true, n_line=(1, 2), draw_points=true, point_chance=2, save_img=false): 生成验证码图片 :param size: 图片的大小,格式(宽,高),默认为(120, 30) :param chars: 允许的字符集合,格式字符串 :param img_type: 图片保存的格式,默认为gif,可选的为gif,jpeg,tiff,png :param mode: 图片模式,默认为rgb :param bg_color: 背景颜色,默认为白色 :param fg_color: 前景色,验证码字符颜色,默认为蓝色#0000ff :param font_size: 验证码字体大小 :param font_type: 验证码字体,默认为 dejavusans.ttf :param length: 验证码字符个数 :param draw_lines: 是否划干扰线 :param n_line: 干扰线的条数范围,格式元组,默认为(1, 2),只有draw_lines为true时有效 :param draw_points: 是否画干扰点 :param point_chance: 干扰点出现的概率,大小范围[0, 100] :param save_img: 是否保存为图片 :return: [0]: 验证码字节流, [1]: 验证码图片中的字符串 width, height = size # 宽, 高 img = image.new(mode, size, bg_color) # 创建图形 draw = imagedraw.draw(img) # 创建画笔 def get_chars(): 生成给定长度的字符串,返回列表格式 return random.sample(chars, length) def create_lines(): 绘制干扰线 line_num = random.randint(*n_line) # 干扰线条数 for i in range(line_num): # 起始点 begin = (random.randint(0, size[0]), random.randint(0, size[1])) # 结束点 end = (random.randint(0, size[0]), random.randint(0, size[1])) draw.line([begin, end], fill=(0, 0, 0)) def create_points(): 绘制干扰点 chance = min(100, max(0, int(point_chance))) # 大小限制在[0, 100] for w in xrange(width): for h in xrange(height): tmp = random.randint(0, 100) if tmp > 100 - 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) / 3), strs, font=font, fill=fg_color) return ''.join(c_chars) if draw_lines: create_lines() 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) # 滤镜,边界加强(阈值更大) mstream = stringio.stringio() img.save(mstream, img_type) if save_img: img.save(validate.gif, img_type) return mstream, strs if __name__ == __main__: mstream, strs = generate_verify_image(save_img=true) print strs
以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。
其它类似信息

推荐信息