2013-04-18 14 views
7

Ho riscontrato un problema con il modulo ImageDraw di PIL, in particolare con il metodo Draw.textsize. Questo metodo dovrebbe prendere una stringa e un font e restituire la larghezza e l'altezza che la stringa occuperebbe quando renderizzata in quel font. Sembra avere un limite inferiore all'altezza che restituisce, tuttavia: non riesco a convincerlo a restituire nulla inferiore a 43. Ecco un esempio (link) per mostrare quello che sto guardando (scatole di delimitazione disegnati attorno al testo in base alla larghezza & altezza restituita), ed ecco il codice che lo ha prodotto:PIL ImageDraw.textsize restituisce un'altezza errata

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() 

Una volta che il carattere si alza a circa 38, la casella di delimitazione si estende per abbinarla correttamente, ma prima è impostata su un valore statico 43. La domanda è: qualcuno sa perché ImageDraw si comporta in questo modo e qualcuno sa come risolverlo? Attualmente sto lavorando al problema impostando:

width = min(width, fontsize+1) 

... ma questa non è ovviamente la soluzione più solida mai ideata.

+0

Dove hai preso il modulo PIL che stai utilizzando? Quando provo a eseguire il tuo codice in Python 2.7.3 viene visualizzato un errore "ImportError: The _imagingft C non installato". – martineau

+0

@martineau Non sono sicuro di dove l'ho preso in origine (mi ricordo che è un dolore al collo da impostare, però). L'installer che ho usato si chiama 'PIL-fork-1.1.7.win32-py2.6.exe', ma senza fortuna trovarlo online adesso. –

+0

L''ImportError' che sto incontrando è un problema comune, che sto cercando di risolvere. Quando/se lo farò, darò un'altra occhiata al tuo problema. – martineau

risposta

2

Il problema di base sembra essere che PIL è super buggato e in sostanza non è più supportato. Il problema qui menzionato non è il peggiore (ad esempio nessuno è in grado di replicarlo perché è così difficile persino installarlo ...).

Alla luce di tutti i problemi che sembrano essere dilaganti in PIL 1.1.7, la soluzione migliore sembra essere semplicemente installare Pillow e andare avanti. Non richiede modifiche al codice per il codice che esegue già PIL (è una forcella PIL in modo da installare la libreria "PIL"), e sembra essere molto più amichevole (e ancora attiva). Come hanno confermato i commentatori della domanda, è un'installazione semplice e senza problemi e funziona davvero come dovrebbe.

Problemi correlati