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

时间:2015-07-01 16:10:40

标签: python fonts python-imaging-library

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

代码很简单:

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

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

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

1 个答案:

答案 0 :(得分:5)

NoTo(实际上只是Adobe的Source Pro字体具有不同的名称,因为谷歌更容易以这种方式推销它)不是单一字体,它是一系列字体。当您go to download them时,Google会明确告诉您,许多不同的目标语言有很多不同的版本,原因很简单:

  1. 如果您需要排版整个行星的已知脚本集,则字体数量远远多于单个字体(OpenType字体的每个文件的字符数限制为65535个字符,因为字形ID编码为USHORT字体和字体是组合的:“字母”实际上可以是字母C和符号°,所以它依赖于三个字形:两个真实的字形和一个虚拟的构图。你用这种方式快速耗尽空间)和
  2. 即使字体可以适合所有字形,相同的脚本也可能需要根据其使用的语言呈现相当不同,所以即使是中文和日文,或阿拉伯语和乌尔都语的单一字体,不起作用。虽然OpenType字体可以通过告知使用哪些变体集以及基于特定语言标签的组合规则来处理这种情况,但这种控件在InDesign或LaTeX中运行良好,对于正在进行的字体来说是最糟糕的用于无控制的上下文(例如Android webview)。
  3. 因此,正确的解决方案是获取所有字体,然后根据您为其生成文本的{script, language}对选择正确的字体。这比你想做的更复杂吗?是。有必要吗?同样是=)