赵灵越 2023-11-01 16:03 采纳率: 99.3%
浏览 2
已结题

python输入多行文本在文本框里,超出图片尺寸,gpt机器人不能胜任

以下是针对您提供的文本的更详细分类整理:

## 输入参数

- 字符串类型输入
- 允许特殊字符
- 字符串尺寸小于文本框尺寸,且小于图片尺寸

## 输入控制

- 默认使用input输入多行字符串,以`# ꧂ ꧁`作为停止标识

## 背景设置

- 默认使用指定背景图,路径为`/storage/emulated/0/数据中心/图片/背景图_43.jpg`
- 指定字体路径为`/storage/emulated/0/字体/华文新魏.TTF`

## 保存路径

- 编号保存路径为`/storage/emulated/0/代码/代码设计/`

## 代码检查

- 每行文本不超过25个字符
- 文本尺寸小于文本框尺寸,且小于图片尺寸
- 文本超出的部分需要新增绘制图片,并另外保存图片
- 自动读取背景图片尺寸

## 字数限制和自动换行

- 每行最大文本数限制为22个字符,超过自动换行

## 其他要求

- 不得使用202471日起作废的方法、函数、定义、变量、库等
  • 写回答

2条回答 默认 最新

  • K_n_i_g_h_t_1990 2023-11-01 16:42
    关注
    # 导入所需的库
    import cv2 # 用于图像处理
    import PIL # 用于图像绘制
    from PIL import ImageFont, ImageDraw # 用于字体和绘制
    import os # 用于文件操作
    
    # 定义输入参数
    input_string = "" # 用于存储输入的字符串
    allow_special_chars = True # 允许特殊字符
    stop_sign = "# ꧂ ꧁" # 停止标识
    background_path = "/storage/emulated/0/数据中心/图片/背景图_43.jpg" # 背景图片路径
    font_path = "/storage/emulated/0/字体/华文新魏.TTF" # 字体路径
    save_path = "/storage/emulated/0/代码/代码设计/" # 保存路径
    
    # 定义背景设置
    background_image = cv2.imread(background_path) # 读取背景图片
    background_width, background_height = background_image.shape[1], background_image.shape[0] # 获取背景图片的宽度和高度
    text_box_width, text_box_height = background_width - 100, background_height - 100 # 设置文本框的宽度和高度,留出一定的边距
    text_box_x, text_box_y = 50, 50 # 设置文本框的左上角坐标
    
    # 定义字体设置
    font_size = 30 # 设置字体大小
    font_color = (255, 255, 255) # 设置字体颜色,白色
    font = ImageFont.truetype(font_path, font_size) # 创建字体对象
    
    # 定义文本处理函数,根据每行最大字符数限制,自动换行,并返回分行后的文本列表
    def wrap_text(text, max_chars):
        text_list = [] # 初始化文本列表为空列表
        line = "" # 初始化当前行为空字符串
        for char in text: # 遍历输入的文本中的每个字符
            if len(line) < max_chars: # 如果当前行的长度小于最大字符数限制
                line += char # 将当前字符添加到当前行中
            else: # 否则,说明当前行已满
                text_list.append(line) # 将当前行添加到文本列表中
                line = char # 将当前字符作为新的一行的开始
        if line: # 如果最后一行不为空
            text_list.append(line) # 将最后一行也添加到文本列表中
        return text_list # 返回分行后的文本列表
    
    # 定义绘制函数,根据输入的文本和背景图片,绘制文字,并保存图片
    def draw_text(text, background):
        image = PIL.Image.fromarray(background) # 将背景图片转换为PIL.Image对象
        draw = ImageDraw.Draw(image) # 创建绘制对象
        text_list = wrap_text(text, 22) # 调用文本处理函数,得到分行后的文本列表
        y_offset = 0 # 初始化y方向的偏移量为0
        for line in text_list: # 遍历每一行文本
            x_offset, y_offset = draw.textsize(line, font=font) # 计算当前行文本的宽度和高度,作为x方向和y方向的偏移量
            if y_offset > text_box_height: # 如果y方向的偏移量超过了文本框的高度,说明需要新增绘制图片,并另外保存图片
                image.save(save_path + "text_image_1.jpg") # 保存当前图片,命名为text_image_1.jpg
                image = PIL.Image.fromarray(cv2.imread(background_path)) # 创建新的图片对象,使用相同的背景图片路径
                draw = ImageDraw.Draw(image) # 创建新的绘制对象
                y_offset = 0 # 重置y方向的偏移量为0
            draw.text((text_box_x, text_box_y + y_offset), line, font=font, fill=font_color) # 在指定位置绘制当前行文本,使用指定的字体和颜色
        image.save(save_path + "text_image_2.jpg") # 保存最后一张图片,命名为text_image_2.jpg
    
    # 主函数
    def main():
        global input_string # 声明全局变量,用于存储输入的字符串
        print("请输入多行字符串,以# ꧂ ꧁作为停止标识:")
        while True: # 循环输入
            line = input() # 输入一行字符串
            if line == stop_sign: # 如果输入的是停止标识
                break # 结束循环
            else: # 否则
                input_string += line # 将输入的字符串添加到全局变量中
        draw_text(input_string, background_image) # 调用绘制函数,传入输入的字符串和背景图片
        print("绘制完成,图片已保存在" + save_path + "目录下")
    
    # 调用主函数
    if __name__ == "__main__":
        main()
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月15日
  • 已采纳回答 11月7日
  • 修改了问题 11月5日
  • 创建了问题 11月1日

悬赏问题

  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战
  • ¥15 svpwm波形异常求解答
  • ¥15 STM32——硬件IIC从机通信代码实现
  • ¥15 关于GRSL投稿的疑问
  • ¥15 微生物组数据分析--微生物代谢物
  • ¥30 求一跃动小子保卫主公Java算法实现
  • ¥15 地图软件开发技术答疑(api, 地点获取,外观样式)