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

won*_*ng2 2 python fonts python-imaging-library

我正在使用Python PIL在背景图像上渲染用户输入的文本(我正在使用枕头)。

代码很简单:

draw = ImageDraw.Draw(im)
draw.text((x, y), text, font=font, fill=font_color)
Run Code Online (Sandbox Code Playgroud)

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

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

Mik*_*ans 5

NoTo(实际上是Adobe的Source Pro字体,具有不同的名称,因为Google可以更轻松地将其推向市场)不是单个字体,而是一系列字体。当您下载它们时,Google会明确告诉您,许多不同的目标语言有很多不同的版本,这有两个简单的原因:

  1. 如果您需要排版整个星球上所有已知的脚本集,则存在的字形要比单个字体容纳的要多得多(由于字形ID被编码为USHORT字段,因此OpenType字体对每个文件有65535个字形的硬限制。字体是有成分的:“字母” ?实际上可以是字母C和符号°,因此它依赖于三个字形:两个真实的字形和一个虚拟的成分。这种方式很快就会耗尽空间),和
  2. 即使一种字体可以适合所有字形,但根据使用的语言,可能需要渲染相同的脚本,因此即使对于中文和日语,阿拉伯语和乌尔都语只有一种字体,也根本无法工作。尽管可以通过告诉OpenType字体使用哪种变体集以及基于特定语言标签的组成规则来解决该问题,但这是一种在InDesign或LaTeX中有效的控件,对于即将使用的字体来说,这是最糟糕的事情用于无控制的上下文(例如Android webview)。

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