diff --git a/Tests/test_imagefont.py b/Tests/test_imagefont.py index 33f37916cb3..91ff44c13db 100644 --- a/Tests/test_imagefont.py +++ b/Tests/test_imagefont.py @@ -7,6 +7,7 @@ import sys import copy import re +import shutil import distutils.version FONT_PATH = "Tests/fonts/FreeMono.ttf" @@ -131,6 +132,15 @@ def test_font_with_open_file(self): with open(FONT_PATH, 'rb') as f: self._render(f) + def test_non_unicode_path(self): + try: + tempfile = self.tempfile("temp_"+chr(128)+".ttf") + except UnicodeEncodeError: + self.skipTest("Unicode path could not be created") + shutil.copy(FONT_PATH, tempfile) + + ImageFont.truetype(tempfile, FONT_SIZE) + def _render(self, font): txt = "Hello World!" ttf = ImageFont.truetype(font, FONT_SIZE, diff --git a/src/PIL/ImageFont.py b/src/PIL/ImageFont.py index 1555e0dee0c..f62a72b2267 100644 --- a/src/PIL/ImageFont.py +++ b/src/PIL/ImageFont.py @@ -140,13 +140,26 @@ def __init__(self, font=None, size=10, index=0, encoding="", self.layout_engine = layout_engine + def load_from_bytes(f): + self.font_bytes = f.read() + self.font = core.getfont( + "", size, index, encoding, self.font_bytes, layout_engine) + if isPath(font): + if sys.platform == "win32": + font_bytes_path = font if isinstance(font, bytes) else font.encode() + try: + font_bytes_path.decode('ascii') + except UnicodeDecodeError: + # FreeType cannot load fonts with non-ASCII characters on Windows + # So load it into memory first + with open(font, 'rb') as f: + load_from_bytes(f) + return self.font = core.getfont(font, size, index, encoding, layout_engine=layout_engine) else: - self.font_bytes = font.read() - self.font = core.getfont( - "", size, index, encoding, self.font_bytes, layout_engine) + load_from_bytes(font) def _multiline_split(self, text): split_character = "\n" if isinstance(text, str) else b"\n"