目录
封装
先封装一个生成图片验证码的文件,文件里面有三个方法,一个是生成公式,一个生成验证码,一个返回结果。
需要自己找一个字体样式。.ttf格式。
import io
import random
import operator
from PIL import Image, ImageDraw, ImageFont
import base64
class MathExpressionGenerator:
def generate_math_expression(self):
# 定义运算符的对应函数
operations = {'+': operator.add, '-': operator.sub, '×': operator.mul, '÷': operator.truediv}
# 生成两个随机数
operand1 = random.randint(1, 20)
operand2 = random.randint(1, 20)
# 随机选择一个运算符
operation = random.choice(['+', '-', '×', '÷'])
# 生成算术表达式字符串
expression = f"{operand1} {operation} {operand2}"
# 将乘法运算符替换为'x',将除法运算符保持不变
expression = expression.replace('×', 'x').replace('÷', '÷')
# 根据选择的运算符计算表达式的结果
result = operations[operation](operand1, operand2)
return expression, result
def create_math_expression_json(self, expression):
# 定义图像的宽度和高度
img_width = 110
img_height = 50
# 创建一个新的RGB图像
image = Image.new("RGB", (img_width, img_height), (157, 176, 191))
draw = ImageDraw.Draw(image)
# 加载字体
font = ImageFont.truetype(r"写自己的字体路径", 40)
# 计算表达式文本的宽度和高度
text_width, text_height = draw.textsize(expression, font=font)
# 计算表达式文本在图像中的位置
text_position = ((img_width - text_width) // 2, (img_height - text_height) // 2)
# 在图像上绘制表达式文本
draw.text(text_position, expression, font=font, fill=(0, 0, 0))
# 将图像保存为字节流
image_io = io.BytesIO()
image.save(image_io, format='PNG')
# 将字节流转换为base64编码的字符串
image_base64 = base64.b64encode(image_io.getvalue()).decode('utf-8')
# 构造带有data URI scheme的图像URL
image_tou = "data:image/png;base64," + image_base64
return image_tou
def calculate_math_expression(self, expression):
# 将表达式中的乘法运算符替换为'*',将除法运算符替换为'/'
expression = expression.replace('×', '*').replace('÷', '/')
# 使用eval函数计算表达式的结果
result = eval(expression)
return result
# 在需要使用的地方调用函数或类的方法
expression_generator = MathExpressionGenerator()
# 生成数学表达式和结果
expression, result = expression_generator.generate_math_expression()
# 创建数学表达式的 JSON 格式
expression_json = expression_generator.create_math_expression_json(expression)
# 计算数学表达式的结果
calculated_result = expression_generator.calculate_math_expression(expression)
调用
在视图里面直接调用。
class Img(APIView):
def get(self, request):
Code = MathExpressionGenerator()
expression, result = Code.generate_math_expression()
expression_image = Code.create_math_expression_json(expression)
# 输出的公式,结果
print(expression,result)
return Response({
"code":200,
"msg":成功,
"data":expression_image
})