python 图片验证码代码分享
程序员文章站
2022-04-20 18:28:45
复制代码 代码如下: #coding: utf-8 import image,imagedraw,imagefont,os,string,random,imagefilte...
复制代码 代码如下:
#coding: utf-8
import image,imagedraw,imagefont,os,string,random,imagefilter
def initchars():
"""
允许的字符集合,初始集合为数字、大小写字母
usage: initchars()
param: none
return: list
返回允许的字符集和
for: picchecker类初始字符集合
todo: nothing
"""
nums = [str(i) for i in range(10)]
lettercase = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z'
]
uppercase = [
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z',
]
return(nums+lettercase+uppercase)
class picchecker():
"""
图片验证代码:
1) 用户注册需填写图片验证码,以阻止机器人注册
2) 图片验证码字符数为 4 位(大小写字母与数字,不区分大小写)。
用户如果没有填写验证码或没有填写正确的验证码,
页面友好性提示用户填写(同时程序方面也做相应限制)
usage: pc = picchecker().createchecker()
param: 很多,如下
chars 允许的字符集合,
类型 list
默认值 initchars()
例子 ['1','2','3']
length 字符串长度
类型 integer
默认值 4
size 图片大小
类型 tutle
默认值 (120,30)
例子 (120,30)
fontsize 字体大小
类型 integer
默认值 25
begin 字符其实位置,即左上角位置
类型 tutle
默认值 (5,-2)
outputtype 输出类型
类型 string
默认值 gif
可选值 gif jpeg tiff png
mode 图片模式
类型 string
可选值 rgb l (还有其他模式,但只推荐这2种)
默认值 rgb
backgroundcolor 背景色
foregroundcolor 前景色
当mode=rgb时,backgroundcolor,foregroundcolor为tutle类型
取值为(integer,integer,integer)
表示rgb颜色值
当mode=l时,backgroundcolor,foregroundcolor为数字,表示黑白模式
取值为0-255
表示灰度
fonttype 字体路径
类型 string
默认值 "simsum.ttc"
jamnum 干扰线条数
类型 (int1,int1)
int1 干扰线条数下限,包含
int2 干扰线条数上线,包含
pointborder 散点噪音
构造方法:对每个像素点使用随机函数确定是否在该像素上画散点噪音
类型 (int1,int2)
int1越大 散点越多
int2越大 散点越少
return: [piccheckerstr,pic]
piccheckerstr: 表示返回图片中对应的字符串,可用于session验证以及其他用途
pic : 返回的图片,类型为image
for :
todo : nothing
"""
#默认字体路径
#default_font_path = os.path.join(os.path.dirname(__file__),'simsun.ttc').replace('\\','/')
def __init__(self,chars = initchars(),size = (120,30),fontsize = 25,
begin = (5,-2),outputtype = 'gif',mode = 'rgb' ,
backgroundcolor = (255,255,255), foregroundcolor = (0,0,255),
fonttype = "simsun.ttc",length = 4,jamnum = (1,2),
pointborder = (40,39)):
"""
初始化配置
"""
#验证码配置
#允许的字符串
self.chars = chars
#图片大小
self.size = size
#字符起始插入点
self.begin = begin
#字符串长度
self.length = length
#输出类型
self.outputtype = outputtype
#字符大小
self.fontsize = fontsize
#图片模式
self.mode = mode
#背景色
self.backgroundcolor = backgroundcolor
#前景色
self.foregroundcolor = foregroundcolor
#干扰线条数
self.jamnum = jamnum
#散点噪音界限
self.pointborder = pointborder
#字体库路径
self.fonttype = fonttype
#设置字体,大小默认为18
self.font = imagefont.truetype(self.fonttype, self.fontsize)
def getpicstring(self):
"""
usage: getpicstring()
return: string
for : 生成给定长度的随机字符串
todo: nothing
"""
#初始化字符串长度
length = self.length
#初始化字符集合
chars = self.chars
#获得字符集合
selectedchars = random.sample(chars,length)
charstostr = string.join(selectedchars,'')
return(charstostr)
def createchecker(self):
"""
usage: createchecker()
return: [str,pic]
str:对应的字符串
pic:对应的图片
for:
todo:
"""
#获得验证码字符串
randstr = self.getpicstring()
#将字符串加入空格
randstr1 = string.join([i+" " for i in randstr],"")
#创建图形
im = image.new(self.mode,self.size,self.backgroundcolor)
#创建画笔
draw = imagedraw.draw(im)
#输出随机文本
draw.text(self.begin, randstr1, font=self.font,fill=self.foregroundcolor)
#im = self.drawtext(draw,randstr,im)
#干扰线
self.createjam(draw)
#散点噪音
self.createpoints(draw)
#图形扭曲
para = [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
]
#print randstr,para
im = im.transform(im.size, image.perspective,para)
#图像滤镜
im=im.filter(imagefilter.edge_enhance_more)
im.save("checker.jpg",self.outputtype)
return([randstr,im])
def createjam(self,draw):
"""
usage: 创建干扰线
para: draw 表示画笔
return: none
for:
todo:
"""
#干扰线条数
linenum = random.randint(self.jamnum[0],self.jamnum[1])
for i in range(linenum):
begin = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
end = (random.randint(0,self.size[0]),random.randint(0,self.size[1]))
draw.line([begin,end],fill = (0,0,0))
def createpoints(self,draw):
"""
usage: 创建散点噪音
para: draw 表示画笔
return: none
for:
todo:
"""
#散点噪音
for x in range(self.size[0]):
for y in range(self.size[1]):
flag = random.randint(0,self.pointborder[0])
if flag > self.pointborder[1]:
draw.point((x,y),fill = (0,0,0))
del flag
if __name__ == '__main__':
c=picchecker()
t=c.createchecker()
print(t)