2012-12-11 12 views
5

Ich habe viel Zeit damit verbracht, meine erste Webanwendung mit Python zu erstellen, und ich verwende zum Generieren von Bildern. Nachdem ich viel gelesen habe, habe ich es geschafft, richtigen Text auszurichten, zu umhüllen, Dateien mit vielen Erweiterungen usw. zu erzeugen.PIL schneidet oben von Buchstaben

Der gesamte von PIL erzeugte Text wird jedoch oben abgeschnitten. Hier ist ein Beispiel.

Example of PIL-generated image with text cut off at the top

Es sollte ŻÓĆjygpq in einer Vielzahl von Schriften sagen (der Font-Name auf der linken Seite).

Ich habe hier einige Beiträge gefunden: fonts clipping with PIL, aber ich möchte vermeiden, ein anderes Modul (aggdraw) zu verwenden; Da ich in PIL schon so viele Dinge herausgefunden habe, möchte ich mich daran halten.

Ich habe viele Schriftarten in verschiedenen Größen versucht, aber Text ist immer noch abgeschnitten. Ich habe sogar versucht, PIL-Fonts zu verwenden, aber es funktioniert immer noch nicht. [Konvertieren von OTF zu BDF und zu PIL].

Dies ist auf Ubuntu. Was soll ich als nächstes versuchen?

+0

Interessantes Problem, ich wäre überrascht, wenn dies behoben werden kann, ohne in die C-Teile von PIL gehen. – mmgp

+0

Können Sie Ihren Beispielcode zum Drucken dieser Texte hinzufügen? Ich habe _imagingft.c gepatcht und es scheint für die Schriftart zu funktionieren, die ich getestet habe. – mmgp

+0

danke für die Antwort. ich es vereinfacht ein wenig, aber das Verfahren ist das gleiche: '' color_text = 'schwarz' text2 = 'DejaVuSans.ttf' font1 = ImageFont.truetype ('/ usr/share/fonts/truetype/ttf -dejavu/DejaVuSans.ttf ', 34) draw.text ((20,50), text2, color_text, font = font1) '' es ist nichts Besonderes darin, nur ein paar Berechnungen für die Verpackung, Zentrierung usw. so es ist nur der grundlegende Ziehext von pil. in der Theorie sollte es out of the Box funktionieren, besonders mit diesen PIL-Schriftarten. – Matt

Antwort

4

Ich hoffe, hier falsch zu sein, aber die einzige richtige Korrektur beruht auf Patchen, wie _imagingft.c den Text rendert. PIL hängt für diese Aufgabe von FreeType ab, aber PIL scheint die Positionierung falsch zu berechnen. Auch die Höhe in getsize wird überschätzt (obwohl das kein Problem verursacht). Im Moment habe ich einen Patch zur Behebung dieser Probleme unter: http://pastebin.com/jP2iLkDN (es scheint einen besseren Weg zu geben, den Render-Code zu patchen).

Hier sind einige Beispiele für die Ausgabe ich ohne den Patch erhalten und mit dem Patch jeweils:

enter image description here       enter image description here

Ergebnisse des Code in der verknüpften Diskussion verwenden. Auf OSX:

enter image description here       enter image description here

auf Ubuntu:

enter image description here       enter image description here

Hier ist der Code, um die Top-Zahlen zu erzeugen:

# -*- encoding: utf8 -*- 
import sys 
import Image, ImageDraw, ImageFont 

im = Image.new("RGBA", (1000, 1000), 'white') 
draw = ImageDraw.Draw(im) 

start_y = 7 
text = u'\u00d1\u00d3yŻ\u00d4Ćgp\u010c\u0137' 
for i in xrange(28, 46, 2): 
    font = ImageFont.truetype('Junicode-Bold.ttf', i) 
    width, height = font.getsize(text) 
    draw.rectangle((0, start_y, width, height + start_y), outline='blue') 
    draw.text((0, start_y), text, font=font, fill='black') 
    start_y += height + 7 

im.crop((0, 0, width + 1, start_y + 2)).save(sys.argv[1]) 

Die unteren Zahlen wurden entsprechend dem Code generiert, der im verknüpften Thema über PIL vorhanden ist, das Teile des Textes abschneidet.

+0

Ein Nachteil dieses Patches besteht darin, dass es Probleme verursacht (Probleme mit der vertikalen Ausrichtung), wenn Sie Buchstaben für Buchstaben anstatt für den gesamten Text auf einmal schreiben. Um das zu beheben, muss der Patch PIL weiter modifizieren, so dass er die Basislinie (eine gute Stelle scheint in "getsize") des Textes zurückgibt und diesen Wert dann weitergibt, wenn ein Aufruf von "render" gemacht wird. Die Funktion 'getsize' müsste auch korrekte Offsets in vertikaler Richtung zurückgeben, die momentan immer 0 ist. – mmgp

+0

Sie haben mir viel Zeit gespart. Vielen Dank! – lqdc

1

Nicht die beste Lösung, aber ich sehe Menschen haben dies gelöst, indem Sie einen führenden Leerzeichen an ihren Text hinzufügen.

+0

danke für die Antwort, leider hilft es nicht. – Matt