美文网首页
Python编写生成验证码脚本

Python编写生成验证码脚本

作者: Royal_KinM | 来源:发表于2017-07-23 23:40 被阅读97次

    笔者用的是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~

    相关文章

      网友评论

          本文标题:Python编写生成验证码脚本

          本文链接:https://www.haomeiwen.com/subject/csomkxtx.html