Python编写生成验证码脚本

2017-07-23  本文已影响97人  Royal_KinM

笔者用的是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:每天催眠自己,告诫自己一定要坚持学习,或许在不久的将来就可以改变现状了!

That's all.PEACE~

上一篇下一篇

猜你喜欢

热点阅读