使用了pillow这个库用来生成图片(PIL),另外需要一个字体(验证码图片的字体风格),我这里用的是 MS Mincho.TTF, 自行更换即可。
pip install pillow
实现了随机验证码图片的生成,可保存到本地,也可以直接被前端引用base64格式
html img引用方式:
<img src="https://img-blog.csdnimg.cn/2022010706300695063.jpeg" alt="vc">
调用
getVerifyCode()获取验证码图片对象(pillow Image)与验证码字符串,图片对象的save方法可以保存图片。
getBase64Code()获取验证码图片base64字符串与验证码字符串。
以下是实现代码:
"""
随机生成验证码,图片(base64Str)
基于pillow
"""
import random
import string
from PIL import Image, ImageFont, ImageDraw
import base64
from io import BytesIO
__version__ = 'v1'
def _randColor():
"""随机颜色"""
return random.randint(32, 127), random.randint(32, 127), random.randint(32, 127)
def _getText():
"""4位验证码"""
return ''.join(random.sample(string.ascii_letters + string.digits, 4))
def _drawLines(draw, num, width, height):
"""划线"""
for temp in range(num):
x1 = random.randint(0, width / 2)
y1 = random.randint(0, height / 2)
x2 = random.randint(0, width)
y2 = random.randint(height / 2, height)
draw.line(((x1, y1), (x2, y2)), fill='black', width=1)
def getVerifyCode():
"""
获取图片对象, 验证码字符串
img.save(‘vc.jpg’) 保存验证码图片
:return: (img对象, str)
"""
code = _getText()
# 图片大小
width, height = 100, 36
# 新图片对象
image = Image.new('RGB', (width, height), 'white')
# 字体
font = ImageFont.truetype('./MS Mincho.TTF', 30)
# draw对象
draw = ImageDraw.Draw(image)
# 绘制字符串
for item in range(4):
draw.text((8 + 24 * item, random.randint(-3, 3)),
text=code[item], fill=_randColor(), font=font)
# 划线
_drawLines(draw, 2, width, height)
return image, code
def getBase64Code():
"""
获取验证码base64数据, 验证码字符串
:return: (base64Str, str)
"""
image, code = getVerifyCode()
outputBuffer = BytesIO()
image.save(outputBuffer, format='JPEG')
byteData = outputBuffer.getvalue()
base64Str = base64.b64encode(byteData)
return base64Str.decode("utf-8"), code