如何使用PIL(pillow)绘制任意语言的文本?

4
我是一个有用的助手,可以为您翻译文本。
我正在使用Python PIL(我使用pillow)在背景图像上呈现用户输入的文本。
代码很简单:
draw = ImageDraw.Draw(im)
draw.text((x, y), text, font=font, fill=font_color)

问题是,用户可能使用任何语言输入,我该如何确定使用哪种字体

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


1
这个问题被提到了noto-fonts的github页面上。单个ttf文件仅限于约64K字形。Unicode 8.0具有超过100K的字形。因此,一个ttf无法容纳所有unicode字形。 - unutbu
1个回答

6

NoTo(字面上只是Adobe的Source Pro字体换了个名字,因为这样更容易让谷歌进行市场宣传)不是单一的字体,而是一个字体族。当你前往下载它们时,谷歌明确告诉你有许多不同版本适用于许多不同的目标语言,原因只有两个简单的原因:

  1. 如果你需要排版全球已知的所有文字,那么所需字形数量远远超过单个字体可以容纳的数量(由于字形ID被编码为USHORT字段,OpenType字体的硬限制为每个文件65535个字形。而字体是组合的:“字母”实际上可以是字母C和符号°,因此它依赖于三个字形:两个真正的字形和一个虚拟组合。这种方式很快就会用完空间),并且
  2. 即使一个字体可以容纳所有字形,同一脚本在不同的语言中使用时可能需要呈现非常不同的样式,因此即使为中文和日文或阿拉伯文和乌尔都语使用单个字体也根本行不通。虽然OpenType字体可以通过告诉它使用哪些变体集以及基于特定语言标签的哪些组合规则来处理这个问题,但这种控制在没有控制的上下文中使用(例如Android webview)是最糟糕的事情。
所以正确的解决方案是获取所有字体,然后根据您生成文本的{脚本,语言}对选择正确的字体。这比您尝试做的更复杂吗?是的。这是必要的吗?同样是的=)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接