2016-01-04 27 views
6

EDIT: dodano kompletny przykład pracujePython library obraz - pozycjonowanie czcionki

mam następujący program:

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

To generuje następujący obraz:

enter image description here

To wydaje się, że przy pisaniu biblioteki tekstowej PIL dodaje trochę marginesu na górze. Ten margines zależy od używanej czcionki.

Jak wziąć to pod uwagę przy próbie ustawienia tekstu (chcę, aby znajdował się w środku prostokąta)?

(Python 2.7.6 Korzystanie z poduszką 2.3.0 na Ubuntu 14.04)

+1

Proszę podać ** kompletny ** program, który demonstruje błąd, w tym wszelkie instrukcje 'import'. –

+1

Jedynym rozsądnym powodem, dla którego mogę to sobie wyobrazić, jest to, że Open Sans używał proporcjonalnych figur, w którym to przypadku margines byłby różnicą między wysokością x a wysokością, w którym to przypadku powinno tam być. Jedynym mniej rozsądnym powodem jest to, że z jakiegoś powodu rozmiar pliku tekstu w pliku PIL ma jakieś "przesunięcie" dodane do niego: https://pillow.readthedocs.org/en/3.0.x/_modules/PIL /ImageFont.html. Może to różnica, którą widzisz? Nie wyjaśniłoby, dlaczego czarny prostokąt nie rozciąga się za całą literą. – millimoose

+0

Dodano pełny przykład roboczy. – Filip

Odpowiedz

5

Nie rozumiem dlaczego, ale odejmując font.getoffset(text)[1] z współrzędna y rozwiązuje go na moim komputerze.

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

Naprawiłem mój problem! Dzięki :) – Filip