2013-04-18 97 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」庫),並且它似乎非常友好(並且仍然活動)。正如這個問題的評論者所證實的那樣,這是一個簡單,無故障的安裝,它實際上就像它應該的那樣工作。

相關問題