Last active
April 10, 2019 06:10
-
-
Save BobDu/bef53e9071eb18c9046395cd70e55bf1 to your computer and use it in GitHub Desktop.
Draw vcode
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def vcode(request): | |
# 引入绘图模块 | |
from PIL import Image, ImageDraw, ImageFont, ImageFilter | |
# 引入随机函数模块 | |
import random | |
r = random.randrange | |
# 定义变量,用于画面的背景色、宽、高 | |
bgcolor = (r(150, 200), r(150, 200), r(150, 200)) | |
width = 100 | |
height = 30 | |
# 创建画面对象 | |
im = Image.new('RGB', (width, height), bgcolor) | |
# 创建画笔对象 | |
draw = ImageDraw.Draw(im) | |
# 定义验证码的备选值 | |
str1 = '123456789ABCDEFGHJKLMNPQRSTUVWXYZ' | |
# 随机选取4个值作为验证码 | |
rand_str = '' | |
for i in range(0, 4): | |
rand_str += str1[r(0, len(str1))] | |
# 构造字体对象 | |
font = ImageFont.truetype('DejaVuSerif-Bold.ttf', 24) | |
for i in range(4): | |
char = Image.new('RGBA', (25, 30), (255, 255, 255, 0)) | |
drawChar = ImageDraw.Draw(char) | |
# 构造字体颜色 | |
fontcolor = (r(0, 50), r(0, 50), r(0, 50)) | |
# 绘制4个字 | |
drawChar.text((r(0, 5), r(0, 10)), rand_str[i], font=font, fill=fontcolor) | |
char = char.rotate(r(-45, 45)) | |
# paste粘贴会失去alpha透明度,需要先提取出来再以mask蒙版参数传递进去 | |
alpha = char.split()[-1] | |
pos = (i*25, r(-3, 3)) | |
im.paste(char, pos, mask=alpha) | |
# 调用画笔的point()函数绘制噪点 | |
for i in range(0, 200): | |
xy = (r(0, width), r(0, height)) | |
fill = (r(100, 180), r(100, 180), r(100, 180)) | |
draw.point(xy, fill=fill) | |
# 模糊处理 太小的时候不要模糊 太糊了 自己都看不清 | |
# im = im.filter(ImageFilter.BLUR) | |
# 存入session,用于做进一步验证 | |
request.session['vcode'] = rand_str | |
# 内存文件操作 | |
import io | |
buf = io.BytesIO() | |
# 将图片保存在内存中,文件类型为png | |
im.save(buf, 'png') | |
# 将内存中的图片数据返回给客户端,MIME类型为图片png | |
return HttpResponse(buf.getvalue(), 'image/png') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment