python3 pillow模块实现简单验证码
本文实例为大家分享了python3pillow模块验证码的具体代码,供大家参考,具体内容如下
直接放代码吧,该写的注释基本都写了
#-*-coding:utf-8-*- #__author__:Pad0y fromPILimportImage,ImageDraw,ImageFont fromrandomimportchoice,randint,randrange importstring #候选字符集,大小写字母+数字 chrs=string.ascii_letters+string.digits defselected_chrs(length): """ 返回length个随机字符串 :paramlength: :return: """ result=''.join(choice(chrs)for_inrange(length)) returnresult defget_color(): """ 设置随机颜色 :return: """ r=randint(0,255) g=randint(0,255) b=randint(0,255) return(r,g,b) defmain(size=(200,100),chrNumber=6,bgcolor=(255,255,255)): """ 定义图片大小,验证码长度,背景颜色 :paramsize: :paramchrNumber: :parambgcolor: :return: """ #创建空白图像和绘图对象 image_tmp=Image.new('RGB',size,bgcolor) draw=ImageDraw.Draw(image_tmp) #生成并计算随机字符的宽度和高度 text=selected_chrs(chrNumber) font=ImageFont.truetype('c:\\windows\\fonts\\Roboto-Regular.ttf',48)#选定一款系统字体 width,height=draw.textsize(text,font) ifwidth+2*chrNumber>size[0]orheight>size[1]: print('SizeError!') return #绘制字符串 startX=0 width_eachchr=width//chrNumber#计算每个字符宽度 foriinrange(chrNumber): startX+=width_eachchr+1 position=(startX,(size[1]-height)//2+randint(-10,10))#字符坐标,Y坐标上下浮动 draw.text(xy=position,text=text[i],font=font,fill=get_color())#绘制函数 #对像素位置进行微调,实现验证码扭曲效果 img_final=Image.new('RGB',size,bgcolor) pixels_final=img_final.load() pixels_tmp=image_tmp.load() foryinrange(size[1]): offset=randint(-1,0)#randint()相当于闭区间[x,y] forxinrange(size[0]): newx=x+offset#像素微调 ifnewx>=size[0]: newx=size[0]-1 elifnewx<0: newx=0 pixels_final[newx,y]=pixels_tmp[x,y] #绘制随机颜色随机位置的干扰像素 draw=ImageDraw.Draw(img_final) foriinrange(int(size[0]*size[1]*0.07)):#7%密度的干扰像素 draw.point((randrange(size[0]),randrange(size[1])),fill=get_color())#randrange取值范围是左开右闭 #绘制随机干扰线,这里设置为8条 foriinrange(8): start=(0,randrange(size[1])) end=(size[0],randrange(size[1])) draw.line([start,end],fill=get_color(),width=1) #绘制随机弧线 foriinrange(8): start=(-50,-50)#起始位置在外边看起来才会像弧线 end=(size[0]+10,randint(0,size[1]+10)) draw.arc(start+end,0,360,fill=get_color()) #保存图片 img_final.save('Veri_code.jpg') img_final.show() if__name__=='__main__': main((200,100),6,(255,255,255))
效果图如下
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。