2014-06-06 6 views
6

Quando scrivo il codice in Windows, questo codice può caricare il file di carattere più che bene:Come posso caricare un file di font con PIL.ImageFont.truetype senza specificare il percorso assoluto?

ImageFont.truetype(filename='msyhbd.ttf', size=30); 

Credo che la posizione di carattere è registrato nel Registro di sistema di Windows. Ma quando mi muovo il codice per Ubuntu, e copiare il file di font verso/usr/share/fonts /, il codice non può individuare il tipo di carattere:

self.font = core.getfont(font, size, index, encoding) 
IOError: cannot open resource 

Come posso ottenere PIL per trovare il file TTF, senza specificando il percorso assoluto?

+0

Se il carattere è TrueType (.ttf), l'hai messo in la sottodirectory TrueType in/usr/share/fonts /? Vorrei provare ora ma non ho accesso a una macchina Ubuntu al momento. – EML

risposta

6

Secondo la documentazione PIL, directory di carattere solo Windows viene ricercato:

Su Windows, se il nome del file specificato non esiste, il caricatore guarda anche nella directory dei font di Windows.

http://effbot.org/imagingbook/imagefont.htm

quindi è necessario scrivere il proprio codice per cercare il percorso completo su Linux.

Tuttavia, Pillow, la forcella PIL, ha attualmente un PR per cercare in una directory Linux. Non è esattamente ancora chiaro quali directory per la ricerca di tutte le varianti di Linux, ma si può vedere il codice qui e forse contribuire al PR:

https://github.com/python-pillow/Pillow/pull/682

7

Per me ha funzionato questo su Xubuntu:

from PIL import Image,ImageDraw,ImageFont 

# sample text and font 
unicode_text = u"Hello World!" 
font = ImageFont.truetype("/usr/share/fonts/truetype/freefont/FreeMono.ttf", 28, encoding="unic") 

# get the line size 
text_width, text_height = font.getsize(unicode_text) 

# create a blank canvas with extra space between lines 
canvas = Image.new('RGB', (text_width + 10, text_height + 10), "orange") 

# draw the text onto the text canvas, and use black as the text color 
draw = ImageDraw.Draw(canvas) 
draw.text((5,5), u'Hello World!', 'blue', font) 

# save the blank canvas to a file 
canvas.save("unicode-text.png", "PNG") 
canvas.show() 

enter image description here

versione di Windows

from PIL import Image, ImageDraw, ImageFont 

unicode_text = u"Hello World!" 
font = ImageFont.truetype("arial.ttf", 28, encoding="unic") 
text_width, text_height = font.getsize(unicode_text) 
canvas = Image.new('RGB', (text_width + 10, text_height + 10), "orange") 
draw = ImageDraw.Draw(canvas) 
draw.text((5, 5), u'Hello World!', 'blue', font) 
canvas.save("unicode-text.png", "PNG") 
canvas.show() 

L'uscita è la stessa di sopra

+1

Questo codice ha funzionato per me in Ubuntu, grazie! – Adjam

+0

@Adjam buono a sapersi –

3

Su mac, semplicemente copio il file di font Arial.ttf nella directory del progetto e tutto funziona.

1

Esiste un pacchetto Python fontconfig, per cui si può accedere alla configurazione dei font di sistema, il codice inviato da Jeeg_robot può essere modificata in questo modo:

from PIL import Image,ImageDraw,ImageFont 
import fontconfig 

# find a font file 
fonts = fontconfig.query(lang='en') 
for i in range(1, len(fonts)): 
    if fonts[i].fontformat == 'TrueType': 
     absolute_path = fonts[i].file 
     break 

# the rest is like the original code: 
# sample text and font 
unicode_text = u"Hello World!" 
font = ImageFont.truetype(absolute_path, 28, encoding="unic") 

# get the line size 
text_width, text_height = font.getsize(unicode_text) 

# create a blank canvas with extra space between lines 
canvas = Image.new('RGB', (text_width + 10, text_height + 10), "orange") 

# draw the text onto the text canvas, and use black as the text color 
draw = ImageDraw.Draw(canvas) 
draw.text((5,5), u'Hello World!', 'blue', font) 

# save the blank canvas to a file 
canvas.save("unicode-text.png", "PNG") 
canvas.show()