生成图片验证码,加减乘除

目录

封装

调用

效果


封装

        先封装一个生成图片验证码的文件,文件里面有三个方法,一个是生成公式,一个生成验证码,一个返回结果。

        需要自己找一个字体样式。.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
        })
效果