zoukankan      html  css  js  c++  java
  • 使用PIL生成验证码

    使用PIL生成二维码的步骤如下:

    1、  需要创建一张白色背景图,指定背景图的长和宽;

    2、  给白色背景图按照每个像素点填充颜色,每个点的颜色随机,可以使用一个生成随机颜色的函数来填充;

    3、  在填充了颜色的图像上绘制字母,这里需要生成字母的函数,可使用生成随机数的函数来生成随机数,然后将随机数转换为字母;需要给每一个字母指定位置,即在图像上的横纵坐标;需要给字母指定字体、大小;需要给字母填充颜色;

    4、  使生成的验证码模糊;

    5、  将绘制好的验证码打印显示。

    示例代码如下:

    from PIL import Image,ImageDraw,ImageFilter,ImageFont
    
    import random
    #生成随机字母A-Z
    def randchar():
        return chr(random.randint(65,90))
    #生成三个随机数,范围为64-255,用来给二维码上的每一个背景点填充颜色
    def rndColor1():
        return (random.randint(64,255),random.randint(64,255),random.randint(64,255))
    #生成三个随机数,范围为32-128,用来给二维码上的字母填充颜色,为避免颜色与背景重合,故设置与背景颜色范围不同
    def rndColor2():
        return (random.randint(32,128),random.randint(32,128),random.randint(32,128))
    
    width=240#二维码的长
    height=60#二维码的高
    #创建一张新图片,颜色纯白,这样方便在图片上填充颜色、增加字母
    img = Image.new("RGB", (width, height), (255, 255, 255))
    #设置字母的字体类型,使用系统字体,将系统字体文件复制并放置于程序文件所在目录
    font = ImageFont.truetype("arial.ttf", 36)
    #在img上绘图
    draw = ImageDraw.Draw(img)
    #为所有的点填充颜色
    for x in range(width):
        for y in range(height):
            draw.point((x, y), fill=rndColor1())
    #在图片上增加字母,在长度方向上放置4个字母,字母由自定义函数rndchar()随机生成,字母颜色由rndColor2()填充
    for i in range(4):
        draw.text((60 * i+20, 10), randchar(), font=font, fill=rndColor2())
    #使验证码模糊
    img = img.filter(ImageFilter.BLUR)
    img.show()
    img.save("code.jpg", "jpeg")
  • 相关阅读:
    难以实践敏捷:估算
    使用AsyncEnumerator简化异步操作
    ESXi 入门配置
    学习模式,不如先了解问题
    我应该用哪种虚拟机?(一)
    在2003上实现Custom Task Pane
    我应该用哪种虚拟机?(终)
    我应该用哪种虚拟机?(二)
    正则表达式周二挑战赛 第十二周
    [译]Node中的ES6特性
  • 原文地址:https://www.cnblogs.com/puheng/p/9242264.html
Copyright © 2011-2022 走看看