我正在尝试将一个长文本转换为多行文本。我写了一些代码,大部分都有效。但是我在计算线宽时遇到了一些问题。因为线路越来越短。可能是由
lastCalculatedWidth
或 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_text = ""
messageBreakLineIndexes = []
calculatedWords = 0
messageLineWidth = draw.textlength(text, font=font)
resultTextLength = 0
lastCalculatedWidth = 0
calculationSwitch = True
while calculatedWords < len(text.split()):
result_text += text.split()[calculatedWords] + " "
resultTextLength += draw.textlength(text.split()[calculatedWords], font=font)
if resultTextLength > img.width - 60:
result_text = result_text.rstrip()
result_text = result_text.rsplit(" ", 1)[0]
messageBreakLineIndexes.append(len(result_text))
calculatedWords -= 1
resultTextLength -= draw.textlength(result_text.rstrip(), font=font) - lastCalculatedWidth
lastCalculatedWidth = draw.textlength(result_text.rstrip(), font=font)
calculatedWords += 1
print(messageBreakLineIndexes)
for i in range(len(messageBreakLineIndexes)):
index = messageBreakLineIndexes[i]
result_text = result_text[:index+i] + "\n" + result_text[index+i:]
draw.text(text_position, result_text, font=font, fill=text_color)
resultTextLength
在换行后无法正确重置,并且 lastCalculatedWidth
无法准确跟踪换行前适合该行的最后一个单词的宽度,这会在计算行宽度时触发累积错误,如下所示循环迭代。所以队伍会逐渐变短。
尝试这样的事情:
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."
# Split the text by spaces to get words
words = text.split()
result_text = ""
messageBreakLineIndexes = []
resultTextLength = 0
img_width = 800
# Iterate over the words directly as an iterable, not by len
for word in words:
# Check the width of the current line plus the next word
word_width = draw.textlength(word, font=font)
if resultTextLength + word_width <= img_width - 60:
# If the line isn't too wide, add the word to the line
result_text += word + " "
resultTextLength += word_width + draw.textlength(" ", font=font) # Add space width
else:
# If the line is too wide, break the line
result_text = result_text.rstrip() + "\n"
messageBreakLineIndexes.append(len(result_text))
result_text += word + " "
resultTextLength = word_width + draw.textlength(" ", font=font) # Reset line width
draw.text(text_position, result_text, font=font, fill=text_color)
如果有效请告诉我。