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程序设计有所帮助。