web-dev-qa-db-fra.com

Comment puis-je charger un fichier de police avec PIL.ImageFont.truetype sans spécifier le chemin absolu?

Lorsque j'écris le code dans Windows, ce code peut très bien charger le fichier de police:

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

Je suppose que l'emplacement de la police est enregistré dans le registre Windows. Mais lorsque je déplace le code vers Ubuntu et que je copie le fichier de police dans/usr/share/fonts /, le code ne peut pas localiser la police:

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

Comment puis-je obtenir PIL pour trouver le fichier ttf sans spécifier le chemin absolu?

16
NeoWang

Selon la documentation PIL, seul le répertoire de polices Windows est recherché:

Sous Windows, si le nom de fichier donné n'existe pas, le chargeur recherche également dans le répertoire des polices Windows.

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

Vous devez donc écrire votre propre code pour rechercher le chemin complet sous Linux.

Cependant, Pillow, la fourchette PIL, dispose actuellement d'un PR pour rechercher un répertoire Linux. On ne sait pas encore exactement quels répertoires rechercher pour toutes les variantes de Linux, mais vous pouvez voir le code ici et peut-être contribuer au PR:

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

9
Hugo

Pour moi, cela a fonctionné sur 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

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

La sortie est la même que ci-dessus enter image description here

21
Giovanni Python

Sur mac, je copie simplement le fichier de police Arial.ttf dans le répertoire du projet et tout fonctionne.

4
Rick

Il y a un paquet Python fontconfig , par lequel on peut accéder à la configuration des polices système, Le code posté par Jeeg_robot peut être changé comme suit:

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