PIL ImageDraw.textsize返回不正确的高度

时间:2013-04-18 16:42:26

标签: python python-imaging-library

我遇到了PIL的ImageDraw模块的问题,特别是Draw.textsize方法。该方法应该采用字符串和字体,并返回字符串在以该字体呈现时将占用的宽度和高度。它似乎在它返回的高度上有一个下限:我无法说服它返回低于43的任何值。这是一个示例(link)来显示我正在查看的内容(基于返回的宽度和高度在文本周围绘制的边界框),以下是生成它的代码:

from PIL import Image, ImageDraw, ImageFont # PIL 1.1.7; Python 2.6.6

im = Image.open(r'C:\test\blank.png').convert('RGB')
draw = ImageDraw.Draw(im)

TEXTCOLOR = (0, 0, 0)
X = 10
Y = 3

for fontsize in xrange(8, 51):
    # Other fonts behave the same way
    font = ImageFont.truetype('Arial.ttf', fontsize)

    text = 'Hello, World! Size %d' % fontsize

    width, height = draw.textsize(text, font=font)
    print 'Font size %d: %d x %d' % (fontsize, width, height)

    bbox = [(X, Y), (X+width, Y+height)]
    draw.rectangle(bbox, outline=TEXTCOLOR)
    draw.text((X, Y), text, font=font, fill=TEXTCOLOR)
    Y += height + 3

im.show()

一旦字体达到大约38的大小,边界框就会拉伸以正确匹配它,但在此之前,它被设置为静态43。问题是,有没有人知道为什么ImageDraw会以这种方式运行,有没有人知道修复它的方法?我目前正在通过设置:

来解决这个问题
width = min(width, fontsize+1)

......但这显然不是有史以来最强大的解决方案。

1 个答案:

答案 0 :(得分:2)

基本问题似乎是PIL是超级越野车,基本上不再受支持。这里提到的问题不是最糟糕的(例如,没有人能够复制它,因为它甚至很难安装......)。

鉴于PIL 1.1.7中似乎猖獗的所有麻烦,最好的解决方案似乎是简单地安装Pillow并继续前进。它不需要对已经运行PIL的代码进行代码更改(它是一个PIL分支,因此它安装了“PIL”库),它似乎非常友好(并且仍然活跃)。正如问题的评论者所证实的那样,这是一个简单,无故障的安装,它实际上就像它应该的那样。