# 导入所需的库
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()