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?
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:
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()
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()
Sur mac, je copie simplement le fichier de police Arial.ttf dans le répertoire du projet et tout fonctionne.
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()