2016-01-04 10 views
6

EDIT: aggiunto esempio funzionante completoPython libreria di immagini - posizionamento carattere

Ho il seguente programma:

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

Ciò genera la seguente immagine:

enter image description here

E ' sembra che durante la scrittura del testo la libreria PIL aggiunga un margine in alto. Questo margine dipende dal tipo di carattere che uso.

Come posso tenerne conto quando si tenta di posizionare il testo (lo voglio nel mezzo di un rettangolo)?

(Usare Python 2.7.6 con il cuscino 2.3.0 su Ubuntu 14.04)

+1

Fornire un programma ** completo ** che mostri l'errore, comprese eventuali istruzioni 'import'. –

+1

L'unica ragione ragionevole che posso immaginare è che Open Sans utilizzava le figure proporzionali, nel qual caso il margine sarebbe la differenza tra l'altezza x e l'ascesa, nel qual caso dovrebbe essere lì. La ragione meno sana è che per qualche ragione, la dimensione di una sequenza di testo in PIL ha aggiunto una sorta di "offset": https://pillow.readthedocs.org/en/3.0.x/_modules/PIL /ImageFont.html. Forse questa è la differenza che stai vedendo? Non spiegherei perché il rettangolo nero non si estende dietro l'intera lettera però. – millimoose

+0

Aggiunto un esempio operativo completo. – Filip

risposta

5

non capisco perché, ma sottraendo font.getoffset(text)[1] dal y coordinare fissa sul mio 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

Questo ha risolto il mio problema! Grazie :) – Filip

Problemi correlati