python图片验证码生成代码
本文实例为大家分享了python图片验证码实现代码,供大家参考,具体内容如下
#!/usr/bin/envpython #-*-coding:UTF-8-*- importrandom fromPILimportImage,ImageDraw,ImageFont,ImageFilter try: importcStringIOasStringIO exceptImportError: importStringIO _letter_cases="abcdefghjkmnpqrstuvwxy"#小写字母 _upper_cases="ABCDEFGHJKLMNPQRSTUVWXY"#大写字母 _numbers="1234567890"#数字 init_chars=''.join((_letter_cases,_upper_cases,_numbers))#生成允许的字符集合 default_font="./DejaVuSans.ttf"#验证码字体 #生成验证码接口 defgenerate_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): """ 生成验证码图片 :paramsize:图片的大小,格式(宽,高),默认为(120,30) :paramchars:允许的字符集合,格式字符串 :paramimg_type:图片保存的格式,默认为GIF,可选的为GIF,JPEG,TIFF,PNG :parammode:图片模式,默认为RGB :parambg_color:背景颜色,默认为白色 :paramfg_color:前景色,验证码字符颜色,默认为蓝色#0000FF :paramfont_size:验证码字体大小 :paramfont_type:验证码字体,默认为DejaVuSans.ttf :paramlength:验证码字符个数 :paramdraw_lines:是否划干扰线 :paramn_line:干扰线的条数范围,格式元组,默认为(1,2),只有draw_lines为True时有效 :paramdraw_points:是否画干扰点 :parampoint_chance:干扰点出现的概率,大小范围[0,100] :paramsave_img:是否保存为图片 :return:[0]:验证码字节流,[1]:验证码图片中的字符串 """ width,height=size#宽,高 img=Image.new(mode,size,bg_color)#创建图形 draw=ImageDraw.Draw(img)#创建画笔 defget_chars(): """生成给定长度的字符串,返回列表格式""" returnrandom.sample(chars,length) defcreate_lines(): """绘制干扰线""" line_num=random.randint(*n_line)#干扰线条数 foriinrange(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)) defcreate_points(): """绘制干扰点""" chance=min(100,max(0,int(point_chance)))#大小限制在[0,100] forwinxrange(width): forhinxrange(height): tmp=random.randint(0,100) iftmp>100-chance: draw.point((w,h),fill=(0,0,0)) defcreate_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) ifdraw_lines: create_lines() ifdraw_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) ifsave_img: img.save("validate.gif",img_type) returnmstream,strs if__name__=="__main__": mstream,strs=generate_verify_image(save_img=True) printstrs
以上就是本文的全部内容,希望对大家学习python程序设计有所帮助。