如何使用PIL(枕头)绘制任何语言的文本



我使用Python PIL在背景图像上呈现用户输入文本(我使用的是pillow)。

代码很简单:

draw = ImageDraw.Draw(im)
draw.text((x, y), text, font=font, fill=font_color)

问题是,用户可以用任何语言输入,我如何确定使用哪个font

ps:我知道我必须先有字体文件,所以我搜索并找到了Google Noto,下载了所有的字体,并将它们放在/usr/local/share/fonts/中,但这些字体是按语言分隔的,所以我仍然无法加载能够呈现所有用户输入文本的字体。

NoTo(它实际上只是Adobe的Source Pro字体,有一个不同的名称,因为谷歌更容易以这种方式营销它)不是一种单一的字体,而是一个字体家族。当你去下载它们时,谷歌明确地告诉你,对于许多不同的目标语言,有很多不同的版本,原因很简单:

  1. 如果你需要对整个星球的已知脚本进行排版,字形的数量远远超过单个字体所能容纳的数量(由于字形ID被编码为USHORT字段,OpenType字体的硬限制为每个文件65535个字形。字体是合成的:"字母"实际上可以是字母C和符号°,因此它依赖于三个字形:两个真实字形和一个虚拟构图。你很快就用完了空间)
  2. 即使一个字体可以容纳所有的字形,同一个脚本也可能需要根据其使用的语言而呈现出相当不同的字体,因此即使只有一个中文和日语字体,或者阿拉伯语和乌尔都语字体,也根本不起作用。虽然OpenType字体可以通过被告知使用哪些变体集,以及基于特定语言标签的哪些组合规则来应对这种情况,但这种控制在InDesign或LaTeX中非常有效,对于将在无控制上下文中使用的字体(例如安卓网络视图)来说是最糟糕的

因此,正确的解决方案是获取所有字体,然后根据为其生成文本的{script, language}对选择正确的字体。这比你想做的更复杂吗?对有必要吗?同样是=)

相关内容

最新更新