在PIL中换行文本
我正在使用PIL库在图片上绘制文字。请问我该如何处理一段文字的换行?这是我的代码:
text = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
image = Image.open("/tmp/background-image.jpg")
draw = ImageDraw.Draw(image)
font = ImageFont.truetype("/usr/share/fonts/truetype/ttf-dejavu/DejaVuSans.ttf"), 50, encoding='unic')
draw.text((100, 100), text, font=font, fill="#aa0000")
image.save("/tmp/image.jpg")
7 个回答
9
当然,你可以手动处理这个问题,每次想换行的时候就用\n。这种方法虽然能让你完全掌控结果,但如果每次字符串都不一样,就不是最好的选择。
另外,还有一个叫做textwrap的模块。
你可以这样使用它:
import textwrap
texto = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
novo = textwrap.wrap(texto, width=20)
print(novo)
结果:
>>>
['Lorem ipsum dolor', 'sit amet,', 'consectetur', 'adipisicing elit,', 'sed do eiusmod', 'tempor incididunt ut', 'labore et dolore', 'magna aliqua. Ut', 'enim ad minim', 'veniam, quis nostrud', 'exercitation ullamco', 'laboris nisi ut', 'aliquip ex ea', 'commodo consequat.', 'Duis aute irure', 'dolor in', 'reprehenderit in', 'voluptate velit esse', 'cillum dolore eu', 'fugiat nulla', 'pariatur. Excepteur', 'sint occaecat', 'cupidatat non', 'proident, sunt in', 'culpa qui officia', 'deserunt mollit anim', 'id est laborum.']
它会根据你设定的宽度,返回一个包含之前字符串的换行列表。
10
被接受的解决方案是按照每行固定40个字符的限制来换行,而没有考虑到框的宽度(以像素为单位)或字体大小。这可能会导致文本填充不足或填充过多。
这里有一个更好的解决方案 - 一个简单的代码片段,可以根据字体的宽度来换行文本:https://gist.github.com/turicas/1455973
23
首先,你需要把文本分成合适长度的行,然后再逐行绘制。
第二步比较简单,但第一步可能会有点棘手,特别是如果使用的是可变宽度的字体。如果你使用的是固定宽度的字体,或者对准确性要求不高,那你可以直接使用textwrap模块来把文本按指定的字符宽度分成行:
margin = offset = 40
for line in textwrap.wrap(text, width=40):
draw.text((margin, offset), line, font=font, fill="#aa0000")
offset += font.getsize(line)[1]