前面几讲讲解了pillow库中两个最重要的模块,Image模块与ImageDraw模块,本讲小编将这两个模块综合应用起来,来制作一个随机自动生成验证码的程序。
1.生成验证码程序的算法设计原理
验证码通常用于网络,是网站为了防止恶意注册和网络机器人登录所采用的一种验证手段。验证码就是随机数字或符号生成的一幅图片,图片里加上一些干扰象素(防止OCR即光学字符识别),由用户肉眼识别其中的验证码信息,输入表单提交网站验证,验证成功后才能等登入系统,使用系统的某项功能。
依据验证码的生成原理,本程序的算法设计流程图如下:
2.算法的实现过程
(1).首先生成背景为白色的一张image对象
imageTemp=Image.new('RGB',(200,200),
(255,255,255))
得如下一张200x200的白色背景的图片
(图一)
(2) 接下来开始利用ImageDraw模块在图片上写入随机生成的字母与数字,具体代码如下:
font=ImageFont.truetype('STHUPO.TTF',45)
draw=ImageDraw.Draw(imageTemp)
text=getCharacters(6)
width,height=draw.textsize(text,font)
#绘制验证码offset=2fori inrange(characterNumber):
offset+=width//characterNumber
position=(offset,
(size[1]-height)//2+random.randint(-10,10))
draw.text(xy=position,text=text[i],
font=font,fill=getColor())imageTemp.show()
注意:以上代码中出现了两个函数:一个是getCharacters(num)函数用于生成num个的随机字母与数字的组合字符串。代码如下
defgetCharacters(length):
result=''fori inrange(length):
result+=random.choice(characters)
returnresult
其中的characters是由所有字母+数字构成的字符串,生成方式采用python的标准库string中的方法来实现,具体实现方式为
characters=string.ascii_letters+string.digits
以上代码中出现的另一个自定义函数为getColor函数,作用是生成随机颜色。代码如下
defgetColor():
r=random.randint(0,255)
g=random.randint(0,255)
b=random.randint(0,255)
return(r,g,b)
最终,代码运行后会实现向图一中写入随机字母与数字。效果如下:
(3) 为了绕开OCR技术,利用ImageDraw模块向图片中写入干扰元素,包括位置与颜色均随机的像素点、直线以及曲线,具体代码如下:
#绘制干扰点fori inrange(int(size[0]*size[1]*0.03)):
draw.point((random.randint(0,size[0]),
random.randint(0,size[1])),fill=getColor())# 绘制干扰线条fori inrange(8):
start=(0,random.randint(0,size[1]-1))
end = (size[0],random.randint(0,size[1] - 1))
draw.line([start,end],fill=getColor(),width=1)
#绘制弧线fori inrange(8):
start=(-10,-10)
end = (size[0]+10,random.randint(0,size[1]+10))
draw.arc(start+end,0,270,fill=getColor(),width=1)
imageTemp.save('result.jpg')
imageTemp.show()
最终,程序运行后,效果如下图所示:
当然,由于字母与数字与颜色都是随机选取的,因此,程序每运行一次效果都不一样。以下列出了一些随机的运行效果。怎么样,你也来试一试吧!
扫码关注公众号
推荐阅读