验证码图像生成的原理是这样的:随机地生成若干个字符,并绘制到图像中,然后对图像的背景或前景进行识别难度的处理,处理措施包括:
(1)随机绘制不同颜色的背景点;(
2)使用随机色绘制字符;
(3)在图像中绘制随机的线段;
(4)对图片进行变形、模糊等处理。
(5)显示花、球等实物图像让操作者识别,以增加提交的难度。
#PIL生成图像验证码
from PIL import Image,ImageDraw,ImageFont
from numpy.random import randint,random
def rndChar(): #产生随机字符
s="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789@#$%&*"
return s[randint(0,len(s))]
def rndColor():#生成随机颜色
return tuple(randint(64,256,3))
w=50*6;h=60 #设置图像的宽度和高度
a=Image.new('RGB',(w,h),(255,255,255)) #创建新图像(颜色模式,尺寸,颜色数值)
font=ImageFont.truetype("C:\\Windows\\Fonts\\simsunb.ttf",48)
b=ImageDraw.Draw(a) #创建Draw对象
def createLines(n): #绘制干扰线
for i in range(n):
begin=(randint(0,w),randint(0,h)) #起始点
end=(randint(0,w),randint(0,h)) #结束点
b.line([begin,end],fill=rndColor(),width=2)
def createPoints(rate): #绘制干扰点
for x in range(w):
for y in range(h):
if random(1)<=rate:
b.point((x,y),fill=rndColor())
def drawStr(): #绘制字符
Str=''
for t in range(6):
Chr=rndChar()
Str=Str+Chr
b.text((50*t+10,5),Chr,font=font,fill=rndColor())
print(Str)
createLines(6)
createPoints(0.15)
drawStr()
a.show()
a.save("figure20.15.png")
运行结果: