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(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。