2013-04-18 63 views
7

我遇到PIL的ImageDraw模块问题,特别是Draw.textsize方法。这种方法应该采用一个字符串和一种字体,并返回该字体呈现时字符串占用的宽度和高度。但它似乎对返回的高度有一个下限,但我不能说服它返回低于43的任何东西。下面是一个例子(link),以显示我正在寻找在(约基于返回的宽度&高度文本绘制边界框),这里是产生它的代码:PIL ImageDraw.textsize返回不正确的高度

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) 

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

+0

你从哪里得到你正在使用的PIL模块?当我尝试在Python 2.7.3下运行代码时,出现'ImportError:_imagingft C模块未安装'错误。 – martineau

+0

@martineau我不知道我最初是从哪里得到的(但我确实记得它的设置很痛苦)。我使用的安装程序被命名为'PIL-fork-1.1.7.win32-py2.6.exe',但现在没有运气发现它。 –

+0

我遇到的'ImportError'是一个常见的问题,我试图解决。当/如果我这样做,我会再看看你的问题。 – martineau

回答

2

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

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

相关问题