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

    Python生成随机验证码,需要使用PIL模块.

    安装:

    1
    pip3 install pillow

    基本使用

    1. 创建图片

    1
    2
    3
    4
    5
    6
    7
    8
    9
    from PIL import Image
    img = Image.new(mode='RGB', size=(12030), color=(255255255))
     
    # 在图片查看器中打开
    # img.show() 
     
    # 保存在本地
    with open('code.png','wb') as f:
        img.save(f,format='png')

    2. 创建画笔,用于在图片上画任意内容

    1
    2
    img = Image.new(mode='RGB', size=(12030), color=(255255255))
    draw = ImageDraw.Draw(img, mode='RGB')

    3. 画点

    1
    2
    3
    4
    5
    6
    img = Image.new(mode='RGB', size=(12030), color=(255255255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示坐标
    # 第二个参数:表示颜色
    draw.point([100100], fill="red")
    draw.point([300300], fill=(255255255))

    4. 画线

    1
    2
    3
    4
    5
    6
    img = Image.new(mode='RGB', size=(12030), color=(255255255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示起始坐标和结束坐标
    # 第二个参数:表示颜色
    draw.line((100,100,100,300), fill='red')
    draw.line((100,100,300,100), fill=(255255255))

    5. 画圆

    1
    2
    3
    4
    5
    6
    7
    img = Image.new(mode='RGB', size=(12030), color=(255255255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示起始坐标和结束坐标(圆要画在其中间)
    # 第二个参数:表示开始角度
    # 第三个参数:表示结束角度
    # 第四个参数:表示颜色
    draw.arc((100,100,300,300),0,90,fill="red")

    6. 写文本

    1
    2
    3
    4
    5
    6
    img = Image.new(mode='RGB', size=(12030), color=(255255255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示起始坐标
    # 第二个参数:表示写入内容
    # 第三个参数:表示颜色
    draw.text([0,0],'python',"red")

    7. 特殊字体文字

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    img = Image.new(mode='RGB', size=(12030), color=(255255255))
    draw = ImageDraw.Draw(img, mode='RGB')
    # 第一个参数:表示字体文件路径
    # 第二个参数:表示字体大小
    font = ImageFont.truetype("kumo.ttf"28)
    # 第一个参数:表示起始坐标
    # 第二个参数:表示写入内容
    # 第三个参数:表示颜色
    # 第四个参数:表示颜色
    draw.text([00], 'python'"red", font=font)

    图片验证码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    import random
     
    def check_code(width=120, height=30, char_length=5, font_file='kumo.ttf', font_size=28):
        code = []
        img = Image.new(mode='RGB', size=(width, height), color=(255255255))
        draw = ImageDraw.Draw(img, mode='RGB')
     
        def rndChar():
            """
            生成随机字母   
            :return:
            """
            return chr(random.randint(6590))
     
        def rndColor():
            """
            生成随机颜色
            :return:
            """
            return (random.randint(0255), random.randint(10255), random.randint(64255))
     
        # 写文字
        font = ImageFont.truetype(font_file, font_size)
        for in range(char_length):
            char = rndChar()
            code.append(char)
            = random.randint(04)
            draw.text([i * width / char_length, h], char, font=font, fill=rndColor())
     
        # 写干扰点
        for in range(40):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
     
        # 写干扰圆圈
        for in range(40):
            draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
            = random.randint(0, width)
            = random.randint(0, height)
            draw.arc((x, y, x + 4, y + 4), 090, fill=rndColor())
     
        # 画干扰线
        for 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__':
        # 1. 直接打开
        # img,code = check_code()
        # img.show()
     
        # 2. 写入文件
        # img,code = check_code()
        # with open('code.png','wb') as f:
        #     img.save(f,format='png')
     
        # 3. 写入内存(Python3)
        # from io import BytesIO
        # stream = BytesIO()
        # img.save(stream, 'png')
        # stream.getvalue()
     
        # 4. 写入内存(Python2)
        # import StringIO
        # stream = StringIO.StringIO()
        # img.save(stream, 'png')
        # stream.getvalue()
     
        pass

    注意:字体文件下载,猛击这里

  • 相关阅读:
    博客园
    未释放的已删除文件
    ssh连接缓慢
    剑指 Offer 38. 字符串的排列
    剑指 Offer 37. 序列化二叉树
    剑指 Offer 50. 第一个只出现一次的字符
    剑指 Offer 36. 二叉搜索树与双向链表
    剑指 Offer 35. 复杂链表的复制
    剑指 Offer 34. 二叉树中和为某一值的路径
    剑指 Offer 33. 二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/bai-max/p/9355861.html
Copyright © 2011-2022 走看看