Djaingo 随机生成验证码(PIL)

基础: https://www.cnblogs.com/wupeiqi/articles/5812291.html

实例: https://www.cnblogs.com/6324TV/p/8811249.html

一、安装PIL模块

pip install pillow

二、调用PIL的类

from PIL import Image
from PIL import ImageFont
from PIL import ImageDraw
from PIL import ImageFilter

三、常用方法

1、创建空白图片

img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
from PIL import Image
img = Image.new(mode='RGB', size=(120, 30), color=(255, 255, 255))
 
# 在图片查看器中打开
# img.show() 
 
# 保存在本地
with open('code.png','wb') as f:
    img.save(f,format='png')

 

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

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')
# 第一个参数:表示字体文件路径
# 第二个参数:表示字体大小
font = ImageFont.truetype("kumo.ttf", 28)
# 第一个参数:表示起始坐标
# 第二个参数:表示写入内容
# 第三个参数:表示颜色
# 第四个参数:表示字体
draw.text([0, 0], 'python', fill="red", font=font)

四、储存位置

# 注意 这里的check_code()是一个函数,第一个返回值是图片,第二个是内容
# 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()

五、例子

生成图片颜色随机的验证码(大写字母、小写字母,数字),含噪点和噪线

# 获取验证码图片
def get_valid_img(request):
    from PIL import Image, ImageDraw, ImageFont
    import random

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

    # 随机获取大写字母、小写字母、数字
    def get_random_str():
        rand_num = str(random.randint(0, 9))    # 注意:int->str
        rand_low_alpha = chr(random.randint(97, 122))
        rand_upper_alpha = chr(random.randint(65, 90))
        rand_char = random.choice([rand_num, rand_low_alpha, rand_upper_alpha])
        return rand_char

    # 创建图片对象 模式、大下、颜色
    img_obj = Image.new(mode='RGB',
                        size=(220, 35),
                        color=get_random_color()
                        )
    # 创建画笔
    draw_obj = ImageDraw.Draw(img_obj)
    # 创建字体对象,字体文件路径,字体大小
    font_obj = ImageFont.truetype("static/font/kumo.ttf", 28)
    # 存储随机生成的str
    temp_list = []
    for i in range(5):
        # 循环5次,获取5个随机字符串
        random_char = get_random_str()
        temp_list.append(random_char)
        # 在图片上一次写入得到的随机字符串,参数是:定位,字符串,颜色,字体,定位根据图片的大下绝定
        draw_obj.text((20+40*i, 0), random_char, get_random_color(), font=font_obj)
    # 验证码
    vail_code = "".join(temp_list)
    print(vail_code)    # 打印随机字符串
    #   将验证码存在Session中
    request.session['vail_code'] = vail_code
    # 噪点噪线, 防止越界
    width = 220
    height = 35
    # 划线
    for i in range(5):
        x1 = random.randint(0, width)
        x2 = random.randint(0, width)
        y1 = random.randint(0, height)
        y2 = random.randint(0, height)
        draw_obj.line((x1, y1, x2, y2), fill=get_random_color())

    # 画点 40 是根据随机字符串的定位,及图片的宽度
    for i in range(40):
        draw_obj.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw_obj.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())
    # 写入内存
    from io import BytesIO
    io_obj = BytesIO()
    # 将生成的图片数据保存在io对象中
    img_obj.save(io_obj, "png")
    # 从io对象里面取上一步保存的数据
    data = io_obj.getvalue()
    return HttpResponse(data)

 

posted @ 2019-08-06 23:17  市丸银  阅读(275)  评论(0编辑  收藏  举报