def verify_code(request): # 引入随机函数模块 import random # 定义变量,用于画面的背景色、宽、高 RGB bgcolor = (random.randrange(20, 100), random.randrange(20, 100), 255) width = 100 height = 25 # 创建画面对象 im = Image.new('RGB', (width, height), bgcolor) # 创建画笔对象 draw = ImageDraw.Draw(im) # 调用画笔的point()函数绘制噪点 for i in range(0, 100): xy = (random.randrange(0, width), random.randrange(0, height)) fill = (random.randrange(0, 255), 255, random.randrange(0, 255)) draw.point(xy, fill=fill) # 定义验证码的备选值 str1 = 'ABCD123EFGHIJK456LMNOPQRS789TUVWXYZ0' # 随机选取4个值作为验证码 rand_str = '' for i in range(0, 4): rand_str += str1[random.randrange(0, len(str1))] font = ImageFont.truetype('simfang.ttf', 23) # 构造字体颜色 fontcolor = (255, random.randrange(0, 255), random.randrange(0, 255)) # 绘制4个字 draw.text((5, 2), rand_str[0], font=font, fill=fontcolor) draw.text((25, 2), rand_str[1], font=font, fill=fontcolor) draw.text((50, 2), rand_str[2], font=font, fill=fontcolor) draw.text((75, 2), rand_str[3], font=font, fill=fontcolor) # 释放画笔 del draw # 存入session,用于做进一步验证 request.session['verifycode'] = rand_str # 内存文件操作 buf = BytesIO() # 将图片保存在内存中,文件类型为png im.save(buf, 'png') # 将内存中的图片数据返回给客户端,MIME类型为图片png return HttpResponse(buf.getvalue(), 'image/png')
出错原因是代码块中字体的问题:
一:在Windows环境,字体一般位于C:\WINDOWS\Fonts
文件夹下。可以先到此文件夹中查看Python程序中指定的字体是否存在;
字体名称英文大小写要一致;
字体名称是英文的,不能中文。
简体黑体常规对应的字体名称为simhei.ttf、
简体仿宋对应的字体名为simfang.ttf;
Python程序中直接写类似华文行楷.ttf、微软简粗黑.TTF等中文名称的字体会出错。
二:查看对应字体英文名称,选中相应字体,右击属性项即可
填写对应的英文名称,问题就可以解决了。