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.
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
@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. –
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