zoukankan      html  css  js  c++  java
  • 验证码

    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)

    图片验证码

    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=(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__':
        # 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()

     应用:

     1 def check_code(request):
     2     #读取硬盘中的文件,在页面显示
     3     # f=open('static/img/flower.jpg','rb')
     4     # data=f.read()
     5     # f.close()
     6     # return HttpResponse(data)
     7 
     8     #创建图片,保存在本地,再读出来渲染
     9     # from PIL import Image
    10     # f=open('code.png','wb')
    11     # img=Image.new(mode='RGB',size=(120,30),color=(0,255,255))
    12     # img.save(f,'png')
    13     #
    14     # f=open('code.png','rb')
    15     # data=f.read()
    16     # f.close()
    17     # return HttpResponse(data)
    18 
    19     #创建图片,可以在上面画点,线,圆,写字,保存在内存中,直接读到页面进行渲染
    20     # from PIL import Image,ImageDraw,ImageFont
    21     # from io import BytesIO
    22     #
    23     # f=BytesIO()
    24     # img=Image.new(mode='RGB',size=(120,30),color=(255,255,255))
    25     # draw=ImageDraw.Draw(img,mode='RGB')
    26     # draw.point([10,10],fill='red')
    27     # draw.line((15,10,50,50),fill=(0,255,0))
    28     # draw.arc((0,0,30,30),0,360,fill='red')
    29     #
    30     #
    31     # font=ImageFont.truetype('static/font/domi.ttf',28)
    32     # draw.text([0, 0], 'python', 'red',font=font)
    33     # img.save(f,'png')
    34     # return HttpResponse(f.getvalue())
    35 
    36     #生成随机字符串
    37     # import random
    38     # char_list=[]
    39     # for i in range(5):
    40     #     char=chr(random.randint(65,90))
    41     #     char_list.append(char)
    42     #     font=ImageFont.truetype('static/font/domi.ttf',28)
    43     #     draw.text((i*24,0),char,(random.randint(0,255),random.randint(0,255),random.randint(0,255)),font=font)
    44     # img.save(f,'png')
    45     # data=f.getvalue()
    46     # code=''.join(char_list)
    47     # request.session['code']=code
    48     # return HttpResponse(data)
    49 
    50 
    51     #引入验证码模块
    52     from io import BytesIO
    53     img,code=rd_check_code()
    54     stream=BytesIO()
    55     img.save(stream,'png')
    56     request.session['code']=code
    57     return HttpResponse(stream.getvalue())
    获取验证码
  • 相关阅读:
    素数路径Prime Path POJ3126 素数,BFS
    Fliptile POJ3279 DFS
    Find the Multiple POJ1426
    洗牌Shuffle'm Up POJ3087 模拟
    棋盘问题 POJ1321 DFS
    抓住那只牛!Catch That Cow POJ3278 BFS
    Dungeon Master POJ2251 三维BFS
    Splitting into digits CodeForce#1104A
    Ubuntu下手动安装Nvidia显卡驱动
    最大连续子序列和
  • 原文地址:https://www.cnblogs.com/liuguniang/p/7232648.html
Copyright © 2011-2022 走看看