笔者用的是python3、pillow4.2.1版本。
pillow库文件里,用到了Image,ImageDraw,ImageFont,Imagefilter模块。
这个项目还用到了random模块。
在python2里用来实现图像处理的库pil,并不兼容python3,但是3里有一个出自pil的库文件pillow可以供使用。
一、分析生成验证码步骤
人们日常生活中,经常会见到并且用到验证码,验证码,通常是由具有颜色的扭曲的字符串加上极具干扰的背景组成。
因此,我在这里把验证码分为四块,基础图片、干扰背景、验证码字符串、滤镜。
1.基础图片
我们先定义一张图片,用以表达验证码。
图片颜色是用RGB颜色模式。
RGB色彩值,通过对红、蓝、绿进行随机定值后,体现具体的颜色,定值范围为0~255,也就是说,能够有1600万种颜色。
2.干扰背景
我在这个脚本里,无脑选择了直线和点作为干扰的背景。(暂时想不到什么因素可以作为干扰背景……)
3.验证码字符串
字符串包括了所有的英文大小写和个位数字。
在这里,验证码包括了随机的五位字符串。
4.滤镜
通过设置滤镜以及其扭曲程度,我们可以扭曲图片。
图片的扭曲方式总共分两大方面:水平和垂直。水平包括了缩放、倾斜和位移。垂直也包括了缩放、倾斜和位移。
二、具体代码
我们先定义一张图片,以用来作为一块画板。
代码:
img = Image.new("RGB",(150,50),(255,255,255))
作用:
第一个参数:代表采用RGB颜色模式
第二个参数:代表图片大小 150 x 50
第三个参数:具体的图片颜色
至此,画板我们已经构造好了,接下来,我们需要一只画笔。
代码:
draw = ImageDraw.Draw(img)
画笔和画板都已经准备好了,我们接下来需要在这个画板上绘制一些由线条和点构成的干扰背景。
代码:
#绘制线条
#线条是由两个定点连接成的线,对于二维背景图来说,每个点都由(x,y)两个坐标值来确定位置。
for i in range(random.randint(1,10)):
draw.line(
[
(random.randint(1,150),random.randint(1,150)),
(random,randint(1,150),random.randint(1,150))
],
fill = (0,0,0)
)
#绘制点
for i in range(1000):
draw.point(
[
random.randint(1,150),
random.randint(1,150)
],
fill = (0,0,0)
)
只剩下需要被识别的字符串了。
代码:
#定义所要生成随机数的范围:字母和数字
font_list = list("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
c_chars = "".join(random.randint(font_list,5))
#绘制字体
font = ImageFont.truetype("simsun.ttc",35)
draw.text((5,5),c_chars,font = font, fill = "green")
#第一个参数:代表文字的位置,距离上和左的距离
#第二个参数:代表文字的内容
#第三个参数:代表字体
#第四个参数:代表字体颜色
最后我们需要定义扭曲的参数从而添加并且使用滤镜。
代码:
#定义扭曲的参数
params = [1 - float(random.randint(1,2))/100,
0,
0,
0,
1 - float(random.randint(1,2))/100,
float(random.randint(1,2))/500,
0.001,
float(random.randint(1,1))/500,
]
#使用滤镜
#添加滤镜
img = img.transform((150,50),Image.PRESPECTIVE,params)
#第一个参数:扭曲的范围
#第二个参数:扭曲的样式
#第三个参数:扭曲的参数
#进行扭曲
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
最后将产生的图片输出显示。
代码:
img.show()
效果图如下:
**验证码效果图**PS:每天催眠自己,告诫自己一定要坚持学习,或许在不久的将来就可以改变现状了!
网友评论