python生成图片验证码

1>借助一个pillow库

         pip3 install pillow

python生成图片验证码_第1张图片

2>解析

img = Image.new('RGB', (236, 36), (0, 0, 0))  # 生成图片对象,大小236X36,三原色 000为黑色,每个色取值范围0~255,

所以,可以写个随机数值,让它随机生成颜色

draw = ImageDraw.Draw(img)    # 类似利用这个图片对象生成一个“画板”,就可以在上面书写内容了
font = ImageFont.truetype('static/font/youyuan.TTF', size=30)  # 设置字体颜色,大小等属性,第一个参数是一个ttf字体
  文件,可以从网上下载需要的字体,size指定字体大小。(这个参数会作为text的font关键字参数传入,非必须参数,因为他们都有
默认值, 是否需要设置视情况而定)
draw.text((i*45+15, 4), random_char,font=font)   # 在那个“画板”上写东西,第一个参数是位置,这里基于i变量变化,否则

写入的内容会在同一个位置,叠到一起,第二个参数就是写入的实际内容,这里就是刚刚生成的随机字符,font关键字传递

刚刚设置的字体属性,字体类型和大小等。

draw.line() 和 draw.ponit()等方法就是画线和点,这里加入随机位置参数,生成随机线和点,干扰项---增加机器识别难度。

f=BytesIO()    # 生成类似一个内存句柄
img.save(f, 'png')   # 于该句柄保存刚才生成的图片
data = f.getvalue()   # 取数据的方法

由于验证码临时生成并且一次性使用,所以没必要把生成得图片存到硬盘,直接内存读写,也更高效

3>实际效果

html文件通过path对应的视图函数获取就行,html会渲染出图片效果。

python生成图片验证码_第2张图片

python生成图片验证码_第3张图片

def get_random_color():
        return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))


def generate_check_code(request):

    from PIL import Image, ImageDraw, ImageFont
    from io import BytesIO


    img = Image.new('RGB', (236, 36), (0, 0, 0))
    draw = ImageDraw.Draw(img)
    font = ImageFont.truetype('static/font/youyuan.TTF', size=30)

    random_check_code = ''
    for i in range(5):
        random_num = str(random.randint(0, 9))
        random_low_alpha = chr(random.randint(97, 122))
        random_upper_alpha = chr(random.randint(65, 90))
        random_char = random.choice([random_num, random_low_alpha, random_upper_alpha])
        draw.text((i*45+15, 4), random_char,font=font)
        random_check_code +=random_char

    width=236
    height=36
    for i in range(8):
        x1=random.randint(0,width)
        x2=random.randint(0,width)
        y1=random.randint(0,height)
        y2=random.randint(0,height)
        draw.line((x1,y1,x2,y2),fill=get_random_color())

    for i in range(36):
        draw.point([random.randint(0, width), random.randint(0, height)], fill=get_random_color())
        x = random.randint(0, width)
        y = random.randint(0, height)
        draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color())

    f=BytesIO()
    img.save(f, 'png')
    data = f.getvalue()

    return HttpResponse(data)

你可能感兴趣的:(python学习)