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 ...'
我正在使用 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 ...'