以PIL格式换行文本

2024-06-05 03:39:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我用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")

Tags: textin图像image文本pilttftmp
3条回答

公认的解决方案基于每行40个字符的固定限制包装文本,不考虑框的宽度(以像素为单位)和字体大小。这很容易导致加注不足或加注过量。

下面是一个更好的解决方案-一个简单的代码片段,用于包装考虑到基于字体的宽度测量的文本: https://gist.github.com/turicas/1455973

您将需要首先将文本拆分为正确长度的行,然后分别绘制每一行。

第二部分很简单,但是如果使用可变宽度字体,第一部分可能很难精确地完成。如果使用固定宽度的字体,或者如果精度没有那么重要,那么您可以使用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]

当然,您可以手动执行此操作,每次要包装文本时都可以使用。如果每次使用不同的字符串并不是最好的方法,但是可以完全控制结果。 但也有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.']

根据您确定的宽度返回前一个字符串上的术语列表。

相关问题 更多 >