You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pillow多行文本实现:行宽计算异常(行渐短)求助

长文本转多行时行宽逐渐缩短的问题修复

问题描述

尝试将长文本转换为多行文本,代码基本可用,但行宽计算存在问题,导致文本行越来越短。推测问题可能由lastCalculatedWidth或resultTextLength或两者共同引发,尝试多种方法仍未解决。

输出效果:
输出效果

问题根源

原代码的核心问题在于:

  1. 宽度回退逻辑混乱:resultTextLength的调整计算完全错误,导致后续宽度累加值越来越小,最终每行宽度持续收缩。
  2. 换行索引处理不当:事后插入换行符时,原始索引会因已插入的换行符产生偏移,导致换行位置错误。

修正后的代码

text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec augue leo, pulvinar maaaıs sagittis sit amet, tristique viverra mauris. Sed mauris quam, faucibus id pretium non, varius eget leo."
result_lines = []
current_line = ""
current_width = 0
max_width = img.width - 60  # 最大行宽,预留左右边距

words = text.split()
for word in words:
    # 计算当前单词(含末尾空格)的宽度
    word_width = draw.textlength(word + " ", font=font)
    # 判断加入当前单词是否超出最大行宽
    if current_width + word_width > max_width:
        result_lines.append(current_line.rstrip())
        current_line = word + " "
        current_width = word_width
    else:
        current_line += word + " "
        current_width += word_width
# 加入最后一行内容
if current_line:
    result_lines.append(current_line.rstrip())

# 拼接成带换行的最终文本
result_text = "\n".join(result_lines)

# 绘制文本
draw.text(text_position, result_text, font=font, fill=text_color)

代码说明

  • 逐行构建逻辑:直接收集符合宽度要求的行内容,避免事后插入换行符的索引偏移问题,逻辑更直观。
  • 准确的宽度计算:每次仅计算当前单词(含空格)的宽度,累加后判断是否超限,超限则换行重置,确保每行宽度尽可能接近最大值。
  • 简化流程:移除原代码中容易出错的单词回退逻辑,遍历一次即可完成分行,降低复杂度。

内容的提问来源于stack exchange,提问作者Asidistaken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 04:48:27