需要安装的依赖库Pillow
pip install Pillow
import random
import base64
import string
from io import BytesIO
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont
from PIL import ImageFilter
def check_code(width=80, height=32, char_length=6, font_file="font/Monaco.ttf", font_size=28):
code = []
img = Image.new(mode='RGB', size=(width, height), color=(255, 255, 255))
draw = ImageDraw.Draw(img, mode='RGB')
def rndColor():
"""
生成随机颜色
:return:
"""
return (random.randint(0, 255), random.randint(10, 255), random.randint(64, 255))
# 写文字
font = ImageFont.truetype(font_file, font_size)
for i in range(char_length):
char = random.choice(string.ascii_letters + string.digits)
code.append(char)
h = random.randint(0, char_length)
draw.text([i * width / char_length, h], char, font=font, fill=rndColor())
# 写干扰点
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
# 写干扰圆圈
for i in range(40):
draw.point([random.randint(0, width), random.randint(0, height)], fill=rndColor())
x = random.randint(0, width)
y = random.randint(0, height)
draw.arc((x, y, x + 4, y + 4), 0, 90, fill=rndColor())
# 画干扰线
for i in range(5):
x1 = random.randint(0, width)
y1 = random.randint(0, height)
x2 = random.randint(0, width)
y2 = random.randint(0, height)
draw.line((x1, y1, x2, y2), fill=rndColor())
img = img.filter(ImageFilter.EDGE_ENHANCE_MORE)
return img, ''.join(code)
def image_to_base64(img):
output_buffer = BytesIO()
img.save(output_buffer, format='JPEG')
byte_data = output_buffer.getvalue()
base64_str = base64.b64encode(byte_data)
return str(base64_str, encoding="utf8")
if __name__ == '__main__':
# 1. 直接打开
img, code = check_code()
img.show()
# 2. 写入文件
# img,code = check_code()
# with open('code.png','wb') as f:
# img.save(f,format='png')
# 3. 写入内存(Python3)
# from io import BytesIO
# stream = BytesIO()
# img.save(stream, 'png')
# stream.getvalue()
pass
在使用的文件中引入该方法,使用redis存储验证码
img, captcha_code = check_code()
millis = int(round(time.time() * 1000))
salt = ''.join(random.sample(string.digits, 8))
code_key = f"{millis}{salt}"
redis_key = f"captcha_{code_key}"
# redis存储
_redis = app.redis
await _redis.setex(redis_key, 600, captcha_code)
base64_img = image_to_base64(img)
最终生成的图形验证码