Python 实现文本转图片输出详解
本文介绍如何使用 Python 的 Pillow 库将指定文本自动换行并渲染为图片。通过加载自定义字体、智能计算排版尺寸、创建画布及逐行绘制,可实现灵活的文本导出功能。完整代码与参数配置可直接运行,适用于快速生成图文素材。
核心逻辑与准备工作
将纯文本转换为图像的核心在于字体的度量计算与画布的动态分配。Python 标准库并不包含高级排版功能,通常需借助第三方图像处理套件。操作前请确保已安装最新版 Pillow,并在系统目录中准备好对应的字体文件(如微软雅黑 msyh.ttf 或思源黑体)。对于包含特殊字符或中文的长文本,还需确认脚本编码格式统一为 UTF-8,避免因平台差异导致乱码或中断。
代码实现与操作步骤
# -*- coding:utf-8 -*-
from PIL import Image, ImageFont, ImageDraw
# 1. 定义输入参数
input_text = u"欢迎访问本站, https://www.example.com"
font_file = "msyh.ttf"
font_size = 18
max_width = 300
margin = 10
# 加载字体对象
font = ImageFont.truetype(font_file, font_size)
draw_canvas = Image.new("RGB", (1, 1), (255, 255, 255))
drawer = ImageDraw.Draw(draw_canvas)
lines = []
current_line = ""
words = input_text.split()
for word in words:
candidate = current_line + " " + word if current_line else word
# 使用现代API校验宽度是否溢出设定阈值
if font.getlength(candidate) >= max_width:
lines.append(current_line)
current_line = word
else:
current_line = candidate
lines.append(current_line)
# 2. 计算画布精确尺寸
_, line_height = draw_canvas.textbbox((0, 0), "T", font=font)[3:]
total_height = line_height * len(lines) + margin * 2
img_obj = Image.new("RGB", (max_width + margin * 2, total_height), (255, 255, 255))
dr = ImageDraw.Draw(img_obj)
# 3. 坐标定位与逐行渲染
y_start = margin
for ln in lines:
dr.text((margin, y_start), ln.strip(), font=font, fill="#000000")
y_start += line_height
img_obj.save("output_result.png")
第1步:初始化画布与字体加载
首先导入 Image、ImageFont 与 ImageDraw 三大核心模块。通过 ImageFont.truetype() 传入本地字体路径与字号,生成用于度量字符宽高的实例。此时可顺手创建一个极小的临时画布,用于后续调用 textbbox 获取单行基准高度,避免硬编码数值导致布局错位。
第2步:文本分块与画布尺寸计算
程序按空格分割原始字符串,逐个拼接测试当前行长。一旦 font.getlength() 返回的像素宽度超出设定的 max_width(默认300),即触发换行逻辑,将上一行存入列表并清空缓冲区。循环结束后补入最后一行。随后根据行数乘以单行高度加上上下留白,动态计算出目标图像的总宽高,并通过 Image.new() 创建白色背景的 RGB 画布。
第3步:逐行绘制并导出结果
以左侧留白 margin 和顶部起始点 y_start 为基准,遍历每一行文本。调用 dr.text((x, y), text, font=font, fill=color) 完成像素级绘制,每写完一行垂直向下偏移一个行高间距。绘制完成后直接调用对象的 save() 方法保存为 PNG 或 JPG 格式。打开新生成的文件即可看到排版整齐的文本图片。
常见问题与排错指南
- 找不到字体文件: Windows 通常位于
C:/Windows/Fonts/,Linux/Mac 需指定绝对路径。未正确引用会导致OSError,建议打印os.path.exists()提前校验。 - 依赖库版本警告:
getsize()在新版 Pillow 中已被标记为废弃。上述代码已全面替换为getlength()和textbbox(),若仍遇到报错,请将 Pillow 升级至 9.2.0 以上版本。 - 中文显示为方块: 检查脚本头部声明是否包含
# -*- coding:utf-8 -*-,并确保所用字体文件本身支持中文字形集(如 TTF/OTF 格式的思源黑体或微软雅黑)。
总结
该方法通过手动控制字符边界检测与动态尺寸计算,解决了固定模板无法适应多变文本长度的痛点。调整字号、行距与背景色后即可直接投入实际工作流中使用。以上就是基于 Python 与 Pillow 将文本转换成图片输出的详细内容,更多关于 Python 图像处理与自动化排版技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













