Skip to content

Instantly share code, notes, and snippets.

@BobDu
Last active April 10, 2019 06:10
Show Gist options
  • Save BobDu/bef53e9071eb18c9046395cd70e55bf1 to your computer and use it in GitHub Desktop.
Save BobDu/bef53e9071eb18c9046395cd70e55bf1 to your computer and use it in GitHub Desktop.
Draw vcode
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