如何在 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: jpn
、kor
、zhs
、zht
,它处理 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()
CJK文字(CJK Unified Ideographs)共享相同的Unicode码位,简繁汉字的区分只能通过字体来处理
部分字体同时支持多种本地化形式(简体中文、繁体中文、汉字等)。例如,Arial Unicode.ttf has 4 locl in the GSUB table: jpn
、kor
、zhs
、zht
,它处理 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()