web-dev-qa-db-ja.com

絶対パスを指定せずにPIL.ImageFont.truetypeでフォントファイルを読み込むにはどうすればよいですか?

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ファイルを見つけるにはどうすればよいですか?

16
NeoWang

PILドキュメントによると、Windowsフォントディレクトリのみが検索されます。

Windowsでは、指定されたファイル名が存在しない場合、ローダーはWindowsフォントディレクトリも検索します。

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

そのため、Linuxで完全なパスを検索するには、独自のコードを記述する必要があります。

ただし、PILフォークであるPillowには現在、Linuxディレクトリを検索するためのPRがあります。どのディレクトリをすべてのLinuxバリアントを検索するかはまだ明確ではありませんが、ここでコードを確認し、PRに貢献できます。

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

9
Hugo

私にとっては、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

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

出力は上記と同じです enter image description here

21
Giovanni Python

Macでは、フォントファイルArial.ttfをプロジェクトディレクトリにコピーするだけで、すべてが機能します。

4
Rick

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