1>借助一个pillow库
pip3 install pillow
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会渲染出图片效果。
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)