目录
封装
调用
效果
封装
先封装一个生成图片验证码的文件,文件里面有三个方法,一个是生成公式,一个生成验证码,一个返回结果。
需要自己找一个字体样式。.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 })