2013-04-18 13 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"ライブラリをインストールする)のコードを変更する必要はなく、非常に面白い(やはり有効です)ようです。コメントのコメント作成者が確認したように、シンプルで問題のないインストールであり、実際にはうまく動作します。

関連する問題