目录
方式五、随机生成颜色图片+随机生成的文字+干扰项,保存到内存
方式一、打开本地的图片
from django.shortcuts import render, HttpResponse with open('static/img/lhf.jpg','rb') as f: # 图片二进制 data=f.read() return HttpResponse(data)
方式二、自动生成随机颜色的图片,保存到本地硬盘
# pip3 install Pillow # pillow 是一个图形处理的模块,功能很强强大 from django.shortcuts import render, HttpResponse 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_valid_code(request): # 生成一张图片,第一个参数是模式:RGB,第二个参数是图片大小,第三个参数是图片颜色 img = Image.new('RGB', (320, 35), color=get_random_color()) # 保存到本地 with open('valid_code.png', 'wb') as f: # 直接用img的save方法,第一个参数是空文件,第二个参数图片格式 img.save(f, 'png') # 打开文件,再返回 with open('valid_code.png', 'rb') as f: data = f.read() return HttpResponse(data)
方式三、自动生成随机颜色图片,保存到内存
from django.shortcuts import render, HttpResponse from PIL import Image,ImageDraw,ImageFont import random from io import BytesIO def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_valid_code(request): # 在内存中生成一个空文件(把它想象成 open('valid_code.png', 'wb') as f:) # 一个是在硬盘上,一个是在内存中 img = Image.new('RGB', (320, 35), color=get_random_color()) f = BytesIO() # 把图片保存到f中 # 放到内存中,存取比较快,而且有自动清理 img.save(f, 'png') data = f.getvalue() return HttpResponse(data)
方式四、随机生成颜色图片+随机生成的文字,保存到内存
from django.shortcuts import render, HttpResponse from PIL import Image,ImageDraw,ImageFont import random from io import BytesIO def get_random_color(): return (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)) def get_valid_code(request): img = Image.new('RGB', (320, 35), color=get_random_color()) # 拿到画笔,把图片传入画笔 img_draw=ImageDraw.Draw(img) # 生成一个字体对象,第一个参数是字体文件的路径,第二个参数是字体大小 font=ImageFont.truetype('static/font/ss.TTF',size=25) msg = '' for i in range(5): num = str(random.randint(0, 9)) c = chr(random.randint(65, 90)) s = random.choice([num, c]) msg += s # 第一个参数,xy的坐标,第二个参数:要写的文字,第三个参数:写文字的颜色,第四个参数:字体 # 不同的字体是不同的ttf文件 img_draw.text((0,0),msg,get_random_color(),font=font) f = BytesIO() # 把图片保存到f中 # 放到内存中,存取比较快,而且有自动清理 img.save(f, 'png') data = f.getvalue() return HttpResponse(data)
方式五、随机生成颜色图片+随机生成的文字+干扰项,保存到内存
from django.shortcuts import render, HttpResponse from PIL import Image, ImageDraw, ImageFont import random from io import BytesIO def get_valid_code(request): ''' 获取随机验证码 - 使用随机背景色 - 随机字符串(数字,大小写) - 存在干扰项(线、点、弧) - 将随机字符串进行存储(放在session中) :param request: :return: ''' img = Image.new('RGB', (320, 35), color=get_random_color()) # 创建对象,歘惹怒图像成为画布 img_draw = ImageDraw.Draw(img) # 生成一个字体对象,参数1:字体样式文件的路径,参数2::字体大小 font = ImageFont.truetype('static/font/ss.TTF', size=25) random_code = '' # 自动生成验证码内文字,数字,大写字母,小写字母 for i in range(5): num = str(random.randint(0, 9)) c_upper = chr(random.randint(65, 90)) c_lower = chr(random.randint(97, 122)) s = random.choice([num, c_upper, c_lower]) random_code += s # 自动生成验证码坐标,相对坐标 - 第一个从0开始 p = (i * 30 + 50, i) # 参数1:xy的坐标,参数2:要写的文字,参数3:写文字的颜色,参数4:字体 # 每次循环渲染一个 img_draw.text(p, s, get_random_color(), font=font) # 将上述随机字符串保存在session中,用于登陆验证 request.session['valid_code'] = random_code print(random_code) # 设置验证框的长宽,作为干扰项的画图范围 height = 35 weight = 320 # 在验证码上添加干扰线 for i in range(10): y = random.randint(0, height) y2 = random.randint(0, height) x = random.randint(0, weight) x2 = random.randint(0, weight) # 设置画线的起始和结束,填充颜色 img_draw.line((x, x2, y, y2), fill=get_random_color()) # 在验证码上添加干扰点 和 干扰狐仙 -- 不建议与上方干扰线一起放置 存在重叠 for i in range(100): y = random.randint(0, height) x = random.randint(0, weight) img_draw.point([x, y], fill=get_random_color()) img_draw.arc((x, y, x + 4, y + 4), 0, 90, fill=get_random_color()) # from io import BytesIO # BytesIO() 以二进制形式存储在内存中 # 放到内存中,存取比较快,而且有自动清理 # 将文件以二进制的形式,以png格式保存在内存中 f = BytesIO() img.save(f, 'png') data = f.getvalue() return HttpResponse(data)