Pillow多行文本实现:行宽计算异常(行渐短)求助
长文本转多行时行宽逐渐缩短的问题修复
问题描述
尝试将长文本转换为多行文本,代码基本可用,但行宽计算存在问题,导致文本行越来越短。推测问题可能由lastCalculatedWidth或resultTextLength或两者共同引发,尝试多种方法仍未解决。
输出效果:
问题根源
原代码的核心问题在于:
- 宽度回退逻辑混乱:
resultTextLength的调整计算完全错误,导致后续宽度累加值越来越小,最终每行宽度持续收缩。 - 换行索引处理不当:事后插入换行符时,原始索引会因已插入的换行符产生偏移,导致换行位置错误。
修正后的代码
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
相关产品推荐
相关产品推荐

