Windowsでコードを記述すると、このコードはフォントファイルを正常にロードできます。
ImageFont.truetype(filename='msyhbd.ttf', size=30);
フォントの場所はWindowsレジストリに登録されていると思います。しかし、コードをUbuntuに移動し、フォントファイルを/ usr/share/fonts /にコピーすると、コードはフォントを見つけることができません。
self.font = core.getfont(font, size, index, encoding)
IOError: cannot open resource
絶対パスを指定せずにPILでttfファイルを見つけるにはどうすればよいですか?
PILドキュメントによると、Windowsフォントディレクトリのみが検索されます。
Windowsでは、指定されたファイル名が存在しない場合、ローダーはWindowsフォントディレクトリも検索します。
http://effbot.org/imagingbook/imagefont.htm
そのため、Linuxで完全なパスを検索するには、独自のコードを記述する必要があります。
ただし、PILフォークであるPillowには現在、Linuxディレクトリを検索するためのPRがあります。どのディレクトリをすべてのLinuxバリアントを検索するかはまだ明確ではありませんが、ここでコードを確認し、PRに貢献できます。
私にとっては、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()
Macでは、フォントファイルArial.ttfをプロジェクトディレクトリにコピーするだけで、すべてが機能します。
Python fontconfig パッケージがあり、システムフォント設定にアクセスできます。Jeeg_robotによって投稿されたコードは次のように変更できます。
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()