2013-04-18 1 views
7

Ich habe ein Problem mit PIL's ImageDraw-Modul, speziell die Draw.textsize Methode. Diese Methode soll eine Zeichenfolge und eine Schriftart übernehmen und die Breite und Höhe zurückgeben, die die Zeichenfolge belegen würde, wenn sie in dieser Schriftart gerendert wird. Es scheint jedoch eine niedrigere Grenze für die Höhe zu haben, die es zurückgibt: Ich kann es nicht überzeugen, etwas niedriger als 43 zurückzugeben. Hier ist ein Beispiel (link) zu zeigen, was ich an (Begrenzungskästen um den Text gezeichnet auf der Grundlage der zurück Breite & Höhe) auf der Suche, und hier ist der Code, der es produziert:PIL ImageDraw.textsize gibt falsche Höhe zurück

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

Sobald die Schrift aufsteht bis etwa Größe 38, dehnt sich die Bounding-Box aus, um sie korrekt abzugleichen, aber zuvor ist sie auf eine statische 43 festgelegt. Die Frage ist, weiß jemand, warum ImageDraw so verhält, und weiß jemand eine Möglichkeit, es zu beheben? Ich arbeite derzeit um das Problem mit der Einstellung:

width = min(width, fontsize+1) 

... aber das ist offensichtlich nicht die robusteste Lösung aller Zeiten.

+0

Woher haben Sie das von Ihnen verwendete PIL-Modul? Wenn ich versuche, Ihren Code unter Python 2.7.3 auszuführen, erhalte ich den Fehler 'ImportError: Der _imagingft C-Modul ist nicht installiert'. – martineau

+0

@martineau Ich bin mir nicht sicher, wo ich es ursprünglich bekommen habe (ich erinnere mich aber daran, dass es ein Schmerz in den Nacken war, um es aufzubauen). Das Installationsprogramm, das ich verwendet habe heißt "PIL-fork-1.1.7.win32-py2.6.exe", aber kein Glück, das jetzt online zu finden. –

+0

Der ImportError, dem ich begegne, ist ein häufiges Problem, das ich versuche zu lösen. Wenn ich das tue, werde ich noch einmal auf Ihr Problem eingehen. – martineau

Antwort

2

Das grundlegende Problem scheint zu sein, dass PIL super buggy ist und im Wesentlichen nicht mehr unterstützt wird. Das hier erwähnte Problem ist nicht das Schlimmste (z. B. kann niemand es replizieren, weil es so schwer ist, es sogar zu installieren ...).

Angesichts all der Probleme, die in PIL 1.1.7 grassieren scheint die beste Lösung zu sein, einfach Pillow zu installieren und mitzubewegen. Es erfordert keine Codeänderungen für Code, der bereits PIL ausführt (es ist ein PIL-Fork, also installiert es die "PIL" -Bibliothek), und es scheint wesentlich freundlicher (und immer noch aktiv) zu sein. Wie die Kommentatoren der Frage bestätigt haben, ist es eine einfache, problemlose Installation und es funktioniert tatsächlich so, wie es soll.