zoukankan      html  css  js  c++  java
  • 使用python生成随机图片验证码

    备注:此功能可以辅助完成用户登录的操作
    一、安装pillow模块(PIL)
    pip3 install pillow -i https://pypi.tuna.tsinghua.edu.cn/simple/
    
    二、生成图片验证码
    from PIL import Image, ImageDraw, ImageFont, ImageFilter
    import random
    
    
    def check_code(width=120, height=30, char_length=5, font_file='utils/Monaco.ttf', font_size=28):
        code = []
        img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
        draw = ImageDraw.Draw(img, mode='RGB')
    
        def rndChar():
            """
            生成随机字母
            :return:
            """
            return chr(random.randint(65, 90))
    
        def rndColor():
            """
            生成随机颜色
            :return:
            """
            return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))
    
        # 写文字
        font = ImageFont.truetype(font_file, font_size)
        for i in range(char_length):
            char = rndChar()
            code.append(char)
            h = random.randint(0, 4)
            draw.text([i * width / char_length, h], char, font=font, fill=rndColor())
    
        # 写干扰点
        for i in range(40):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
    
        # 写干扰圆圈
        for i in range(40):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
            x = random.randint(0, width)
            y = random.randint(0, height)
            draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())
    
        # 画干扰线
        for i in range(5):
            x1 = random.randint(0, width)
            y1 = random.randint(0, height)
            x2 = random.randint(0, width)
            y2 = random.randint(0, height)
    
            draw.line((x1, y1, x2, y2), fill=rndColor())
    
        img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
        return img, ''.join(code)
    
    
    if __name__ == '__main__':
        image_object, code = check_code()
    
        # 1、直接打开
        """
        img,code = check_code()
        img.show()
        """
    
        # 2、把图片写入文件
        """
        with open('code.png', 'wb') as f:
            image_object.save(f, format='png')
        """
    
        # 3、把图片的内容写到内存 stream
        """
        from io import BytesIO
        stream = BytesIO()
        image_object.save(stream, 'png')
        stream.getvalue()
        """
    
    三、基本操作
    # 1.创建图片
    
    from PIL import Image
    
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    
    # (1)、在图片查看器中打开
    img.show()
    
    # (2)、保存在本地
    with open('code.png', 'wb') as f:
        img.save(f, format='png')
    
    
    # 2.创建画笔,用于在图片上画任意内容
    
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')
    
    
    # 3.画点
    
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示坐标
    # 第二个参数:表示颜色
    draw.point([100, 100], fill="red")
    draw.point([300, 300], fill=(255, 255, 255))
    
    
    # 4.画线
    
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示起始坐标和结束坐标
    # 第二个参数:表示颜色
    draw.line((100, 100, 100, 300), fill='red')
    draw.line((100, 100, 300, 100), fill=(255, 255, 255))
    
    
    # 5.画圆
    
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
    # 第二个参数:表示开始角度
    # 第三个参数:表示结束角度
    # 第四个参数:表示颜色
    draw.arc((100, 100, 300, 300), 0, 90, fill="red")
    
    
    # 6.写文本
    
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示起始坐标
    # 第二个参数:表示写入内容
    # 第三个参数:表示颜色
    draw.text([0, 0], 'python', "red")
    
    
    # 7.特殊字体文字
    
    img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示字体文件路径
    # 第二个参数:表示字体大小
    font = ImageFont.truetype("kumo.ttf", 28)
    # 第一个参数:表示起始坐标
    # 第二个参数:表示写入内容
    # 第三个参数:表示颜色
    # 第四个参数:表示颜色
    draw.text([0, 0], 'python', "red", font=font)
    
  • 相关阅读:
    .NetCore Grpc 客服端 工厂模式配置授权
    DOCKER 拉取 dotnet 镜像太慢 docker pull mcr.microsoft.com too slow
    Introducing .NET 5
    VSCode 出现错误 System.IO.IOException: The configured user limit (128) on the number of inotify instances has been reached.
    Omnisharp VsCode Attaching to remote processes
    zookeeper3.5.5 centos7 完全分布式 搭建随记
    Hadoop2.7.7 centos7 完全分布式 配置与问题随记
    MySQL索引 索引分类 最左前缀原则 覆盖索引 索引下推 联合索引顺序
    SQL基础随记3 范式 键
    MySQL调优 优化需要考虑哪些方面
  • 原文地址:https://www.cnblogs.com/fengting0913/p/12684698.html
Copyright © 2011-2022 走看看