如何在 Python 的 PIL ImageFont 中指定 CJK 脚本的本地化形式?

How to specify localized forms of CJK scripts in Python's PIL ImageFont?

CJK文字(CJK Unified Ideographs)共享相同的Unicode码位,简繁汉字的区分只能通过字体来处理

部分字体同时支持多种本地化形式(简体中文、繁体中文、汉字等)。例如,Arial Unicode.ttf has 4 locl in the GSUB table: jpnkorzhszht,它处理 CJK 脚本的不同本地化形式。 jpn是默认的,对应汉字。

如何选择要在 Python 中使用的本地化表单?更具体地说,我想在使用 PIL package.

时控制本地化形式
image_font = ImageFont.truetype(font="Arial Unicode.ttf", size=10) # PIL.ImageFont.FreeTypeFont object

PIL 版本 8.0.1 是否可以使用此本地化表单规范?

我终于找到了解决办法。要指定 Python 的 PIL 中的 CJK 字符形式,只需在 ImageDraw.text() (link) 中指定 language 参数即可,这需要libraqm 包。

以下示例显示结果:

languages = ["", "zh", "zh-Hans", "zh-CN", "zh-TW", "zh-HK"]
char_ = "骨"
font = ImageFont.truetype("Arial Unicode.ttf", size=32)
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(20, 8))
axes = axes.ravel() 
for i, c in enumerate([char_] * len(languages)):
    img = Image.new("L", (64, 64), 255)
    draw = ImageDraw.Draw(img)
    if i == 0:
        draw.text((0, 0), c, font=font)
    else:
        draw.text((0, 0), c, font=font, language=languages[i])
    axes[i].imshow(img) 
    axes[i].set_title(languages[i] + " {}".format(ord(char_)))
plt.show()