Python 实现文本转图片输出详解

小满
小满
发布时间:2026-10-12 | 3人浏览过
原创

本文介绍如何使用 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 图像处理与自动化排版技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表