In this post, I want to write about two issues related to the ImageFont module in the PIL package.

# Can not use non-ASCII characters in font path on Windows

On Windows, if you use non-ASCII characters in font path in ImageFont.truetype() method, you will get the following error:

OSError                                   Traceback (most recent call last)
<ipython-input-2-72cffff24bf9> in <module>()
----> 1 font = ImageFont.truetype("../测试.ttf")

D:\Anaconda\lib\site-packages\PIL\ImageFont.py in truetype(font, size, index, encoding, layout_engine)
278
279     try:
--> 280         return FreeTypeFont(font, size, index, encoding, layout_engine)
281     except IOError:
282         ttf_filename = os.path.basename(font)

D:\Anaconda\lib\site-packages\PIL\ImageFont.py in __init__(self, font, size, index, encoding, layout_engine)
143         if isPath(font):
144             self.font = core.getfont(font, size, index, encoding,
--> 145                                      layout_engine=layout_engine)
146         else:

OSError: cannot open resource

This is an issue related to how Unicode file paths are handled on Windows platform.

A simple solution is to rename the font file to include only ASCII characters. Another solution is to read the font file in binary form. A working example is shown below:

from PIL import ImageFont
from io import BytesIO

with open("测试.ttf", "rb") as f:
font = ImageFont.truetype(bytes_font)
print(font.getsize("test"))

# Invalid reference when drawing text on image

When drawing text on image using PIL, you may see an error complaining about invalid reference:

python draw_text.py
Traceback (most recent call last):
File "draw_text.py", line 12, in <module>
drawer.text((10, 10), "大美中國", font=font, fill=(10, 10, 10))
File "D:\Anaconda\lib\site-packages\PIL\ImageDraw.py", line 275, in text
*args, **kwargs)
File "D:\Anaconda\lib\site-packages\PIL\ImageFont.py", line 185, in getmask2
size, offset = self.font.getsize(text, direction, features)
OSError: invalid reference

This is caused by a missing table in the font, which is discussed here. To fix this problem, we need to use the open-source tool ttfautohint.

ttfautohint test.ttf test_processed.ttf