2013-04-18 10 views
7

Mam problem z modułem ImageDraw PIL, w szczególności z metodą Draw.textsize. Ta metoda powinna przyjmować ciąg i czcionkę oraz zwracać szerokość i wysokość, które łańcuch będzie zajmował po renderowaniu w tej czcionce. Wydaje się mieć niższą granicę na wysokości, która powraca: nie mogę przekonać go, by zwrócił coś mniejszego niż 43. Oto przykład (link), aby pokazać to, czego szukam w (ograniczających skrzynek przygotowanych wokół tekstu opartego na zwróconej szerokości & wysokości), a oto kod, który go produkowane:PIL ImageDraw.textsize zwraca niepoprawną wysokość

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

Po czcionka wstaje do rozmiaru 38, ramka ograniczająca rozciąga się, aby dopasować ją poprawnie, ale przedtem jest ustawiona na statyczną wartość 43. Pytanie brzmi, czy ktoś wie dlaczego ImageDraw zachowuje się w ten sposób i czy ktoś wie o sposobie jego naprawy? Obecnie pracuję nad problemem, ustawiając:

width = min(width, fontsize+1) 

... ale to oczywiście nie jest najsolidniejsze rozwiązanie, jakie kiedykolwiek opracowano.

+0

Skąd wziąłeś moduł PIL, którego używasz? Kiedy próbuję uruchomić twój kod w Pythonie 2.7.3, pojawia się błąd 'ImportError: _imagingft moduł C nie jest zainstalowany'. – martineau

+0

@martineau Nie jestem pewien, skąd je otrzymałem pierwotnie (pamiętam, że jest to ból w szyi, aby skonfigurować). Instalator, którego użyłem, nazywa się "PIL-fork-1.1.7.win32-py2.6.exe", ale nie ma szczęścia, że ​​znalazł go teraz w Internecie. –

+0

Napotkany błąd "ImportError" jest częstym problemem, który próbuję rozwiązać. Kiedy/jeśli to zrobię, jeszcze raz przyjrzę się twojemu problemowi. – martineau

Odpowiedz

2

Podstawową kwestią wydaje się być to, że PIL jest bardzo błędny i zasadniczo nie jest już obsługiwany. Wymieniony tutaj problem nie jest najgorszy (np. Nikt nie jest w stanie go powielić, ponieważ jest tak trudny do zainstalowania ...).

W świetle wszystkich problemów, które wydają się szalone w PIL 1.1.7, najlepszym rozwiązaniem wydaje się po prostu instalacja Pillow i poruszanie się. Nie wymaga zmian kodu dla kodu, który już uruchamia PIL (jest to fork PIL, więc instaluje bibliotekę "PIL") i wydaje się być znacznie bardziej przyjazny (i wciąż aktywny). Jak potwierdzili komentatorzy, jest to prosta, bezproblemowa instalacja i działa tak, jak powinna.