Python PIL:用省略号替换超出范围的文本

Python PIL: Replace Out-of-Range Text with Ellipsis

我正在使用 Pillow 在图像上添加一行文本,有时文本可能太长以至于超过了图像的宽度。在这种情况下,我想用省略号 (...) 替换多余的字符,以便它可以正好适合图像。

我正在使用 ImageDraw.Draw(img).text(position, inputtext)。我想知道 Pillow 是否有自动执行此操作的方法?非常感谢。

没有内置的。 不过自己写也不是那么难。

创建 ImageFont 对象后,您可以使用其 getsize 方法查询文本的宽度和高度。

如果它比图像的宽度长,请缩短文本并重试。假设我们有 100 像素的长度。

In [1]: s = 'this is a text that might be too long.'

In [2]: from PIL import ImageFont

In [4]: font = ImageFont.truetype("/usr/local/share/fonts/local/Komika.ttf")

In [6]: split = s.split(' ')

In [7]: for i in range(len(split)+1):
   ...:     print(i, font.getsize(' '.join(split[:i])+' ...'))
   ...:     
0 (9, 10)
1 (25, 10)
2 (35, 10)
3 (43, 10)
4 (63, 10)
5 (84, 10)
6 (111, 12)
7 (124, 12)
8 (141, 12)
9 (163, 12)

所以我们只能用5个字;

In [10]: newstring = ' '.join(split[:5])+' ...'

In [11]: font.getsize(newstring)
Out[11]: (84, 10)

In [12]: newstring
Out[12]: 'this is a text that ...'