Python生成随机验证码

安装PIL模块:

pip3 install pillow

一、基本使用

1、创建图片

from PIL import Image

image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255))

# 在图片查看器中打开
# image.show()

# 保存在本地
with open("1.png", "wb") as f:
    image.save(f, format="png")

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

image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(image, mode="RGB")

3、画点

image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(image, mode="RGB")
# 第一个参数:坐标
# 第二个参数:颜色
draw.point([100, 100], fill="red")
draw.point([300, 300], fill=(255, 255, 255))

4、画线

image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(image, mode="RGB")
# 第一个参数:表示起始坐标和结束坐标
# 第二个参数:表示颜色
draw.line((100,100,100,300), fill="red")
draw.line((100,100,300,100), fill=(255, 255, 255))

5、画圆

image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(image, mode="RGB")
# 第一个参数:起始坐标和结束坐标(圆要画在其中间)
# 第二个参数:开始角度
# 第三个参数:结束角度
# 第四个参数:颜色
draw.arc((100,100,300,300), 0, 90, fill="red")

6. 写文本

image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(image, mode="RGB")
# 第一个参数:起始坐标
# 第二个参数:写入内容
# 第三个参数:颜色
draw.text([0,0], "python", "red")

7、特殊字体文字

image = Image.new(mode="RGB", size=(120, 30), color=(255, 255, 255))
draw = ImageDraw.Draw(image, mode="RGB")
# 第一个参数:字体文件路径
# 第二个参数:字体大小
font = ImageFont.truetype("kumo.ttf", 28)
# 第一个参数:起始坐标
# 第二个参数:写入内容
# 第三个参数:颜色
# 第四个参数:字体
draw.text([0, 0], "python", "red", font=font)

字体文件,或者搜索 TrueType 字体文件 下载自己喜欢的字体。

二、图片验证码示例

import random
from PIL import Image, ImageDraw, ImageFont

def get_random_color():
    """获取随机颜色"""
    return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))

def get_valid_code():
    """生成随机验证码"""
    image = Image.new("RGB", (136, 36), "rgb(255, 255, 255)")
    draw = ImageDraw.Draw(image)
    font = ImageFont.truetype("static/kumo.ttf", size=34)
    # 生成5个随机字母或数字
    valid_list = []
    for i in range(1, 6):
        number = str(random.randint(0, 9))
        lower_letter = chr(random.randint(97, 122))
        upper_letter = chr(random.randint(65, 90))
        random_char = random.choice([number, lower_letter, upper_letter])
        draw.text((i*20, 0), random_char, fill="black", font=font)
        valid_list.append(random_char)

    width = 136
    height = 36
    # 画干扰线
    for i in range(3):
        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=get_random_color())
    # 画干扰点
    for i in range(100):
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.point([x, y], fill=get_random_color())

    valid_str = "".join(valid_list)
    # valid_str保存在session中,在登录时用来做验证
    # request.session["valid_str"] = valid_str
    return image, valid_str

if __name__ == "__main__":
    image, code = get_valid_code()
    # 1、直接打开
    image.show()

    # 2、保存在本地
    # with open("code.png", "wb") as f:
    #     image.save(f, format="png")

    # 3、写入内存(Python3)
    # import io
    # stream = io.BytesIO()
    # image.save(stream, "png")
    # valid_image = stream.getvalue()
    # stream.close()
    # 从内存中获取刚生成的验证码图片,返回给前端
    # return HttpResponse(valid_image)

    # 4、写入内存(Python2)
    # import StringIO
    # stream = StringIO.StringIO()
    # image.save(stream, "png")
    # stream.getvalue()

Django登录实现验证码认证示例.zip

 

posted @ 2019-03-03 01:01  就俗人一个  阅读(324)  评论(0编辑  收藏  举报