2016-01-04 12 views
6

EDIT: hinzugefügt komplettes ArbeitsbeispielPython Image Library - Schrift Positionierung

Ich habe folgendes Programm:

from PIL import Image, ImageDraw, ImageFont 

FULL_SIZE = 50 
filename = 'font_test.png' 
font="/usr/share/fonts/truetype/msttcorefonts/arial.ttf" 
text="5" 

image = Image.new("RGBA", (FULL_SIZE, FULL_SIZE), color="grey") 
draw = ImageDraw.Draw(image) 
font = ImageFont.truetype(font, 40) 
font_width, font_height = font.getsize(text) 
draw.rectangle(((0, 0), (font_width, font_height)), fill="black") 
draw.text((0, 0), text, font=font, fill="red") 
image.save(filename, "PNG") 

Dies erzeugt folgendes Bild:

enter image description here

Es scheint, dass beim Schreiben der Text-PIL-Bibliothek ein Rand oben hinzugefügt wird. Dieser Spielraum hängt von der Schriftart ab, die ich verwende.

Wie kann ich dies berücksichtigen, wenn ich versuche, den Text zu positionieren (ich möchte, dass er in der Mitte eines Rechtecks ​​steht)?

(mit Python 2.7.6 mit Kissen 2.3.0 auf Ubuntu 14.04)

+1

Bitte geben Sie ein ** vollständiges ** Programm an, das den Fehler einschließlich aller 'Import'-Anweisungen demonstriert. –

+1

Der eine vernünftige Grund, den ich mir vorstellen kann, ist, wenn Open Sans proportionale Zahlen verwendet, in welchem ​​Fall der Rand die Differenz zwischen der x-Höhe und dem Aufstieg wäre, in diesem Fall soll es dort sein. Der eine weniger vernünftige Grund ist, dass aus irgendeinem Grund die Größe eines Textlaufs in PIL eine Art "Offset" hinzugefügt hat: https://pillow.readthedocs.org/en/3.0.x/_modules/PIL /ImageFont.html. Vielleicht ist das der Unterschied, den du siehst? Würde nicht erklären, warum sich das schwarze Rechteck nicht hinter dem ganzen Buchstaben erstreckt. – millimoose

+0

Vollständiges Arbeitsbeispiel hinzugefügt. – Filip

Antwort

5

Ich verstehe nicht, warum, aber font.getoffset(text)[1] von dem y Koordinaten Subtrahieren fixiert es auf meinem Computer.

from PIL import Image, ImageDraw, ImageFont 

FULL_SIZE = 100 
filename = 'font_posn_test.png' 
fontname = '/usr/share/fonts/truetype/msttcorefonts/arial.ttf' 
textsize = 40 
text = "5" 

image = Image.new("RGBA", (FULL_SIZE, FULL_SIZE)) 
draw = ImageDraw.Draw(image) 
font = ImageFont.truetype(fontname, textsize) 
print font.getoffset(text) 
print font.font.getsize(text) 
font_width, font_height = font.getsize(text) 

font_y_offset = font.getoffset(text)[1] # <<<< MAGIC! 

draw.rectangle(((0, 0), (font_width, font_height)), fill="black") 
draw.text((0, 0 - font_y_offset), text, font=font, fill="red") 
image.save(filename, "PNG") 
+0

Das hat mein Problem behoben! Vielen Dank :) – Filip

Verwandte Themen