Pillow - 如何绘制文字标签符号?

3
Unifont 包含标签、变量选择器和其他不可打印字符的字形。
例如,在 https://unifoundry.com/pub/unifont/unifont-14.0.04/font-builds/unifont_upper-14.0.04.ttf 结尾处,有这些标签(如 FontForge 中所示): Screenshot showing lots of characters in FontForge. 每个标签都有一个应该可打印的字形: Outline drawing of a character. 我想使用 Unifont 在 Pillow 图像上绘制该字形。
from PIL import Image, ImageDraw, ImageFont

text = chr(0x2A6B2) + " " + chr(0x0E0026)

font = ImageFont.truetype("unifont_upper-14.0.04.ttf", size=64)

image1 = Image.new("RGB", (256, 64), "white")
draw1  = ImageDraw.Draw(image1)
draw1.text( (0 , 0), text, font=font, fill="black")
image1.save("test aa.png")

第一个字符(一个CJK汉字)可以正确绘制。但是标签字符是不可见的。

有没有办法让Pillow绘制我在FontForge中可以看到的形状?

2个回答

2
似乎简短的答案是,不幸的是,“你不能”。
Pillow通常使用libraqm来排版文本(即执行诸如将Unicode字符串映射到字体中的字形等操作,具体地说是raqm_layout函数)。
该库反过来使用一个叫做harfbuzz的库来进行文本造型。
您想要的标记字符,包括U+E0026,在Unicode中具有默认可忽略属性。默认情况下,harfbuzz不显示具有此属性的字符,而是用空白字形替换它们。但是,通过使用标志,可以修改这种行为:特别是,调用hb_buffer_set_flags并使用HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES似乎可以实现您想要的效果,即显示这些字符而不是将它们变成空白。
问题在于,当libraqm 调用harfbuzz时,它无法设置此标志-虽然它确实允许您设置其他一些标志,但不包括此标志 :(
为了达到你想要的目的,我猜你需要使用一个更低级别的库-显然,有FreeType和harfbuzz的Python绑定,但我没有使用过任何一个,所以我无法对这可能涉及多少麻烦发表评论。

0

来自The Unicode Standard,第23章特殊区域和格式字符第23.9节,标记字符

标记字符:U+E0000–U+E007F

该块编码了一组95个特殊用途的标记字符,以便使用可以在Unicode中严格与普通文本内容字符分离的字符来拼写基于ASCII的字符串标记...

显示。标记字符块中的字符在正常文本中没有可见的呈现方式,语言标记本身也不会被显示。

并来自Unicode常见问题解答(我自己强调):

问:如果不支持,哪些字符应该被显示为不可见?

所有默认可忽略字符都应该被渲染为完全不可见(且不推进,即“零宽度”),如果在呈现中没有明确支持。

这是否意味着字体永远无法显示其中一个字符?

不是的。渲染系统也可以支持特殊模式,例如“显示隐藏”,旨在显示本来不会显示的字符。字体可以包含用于默认可忽略代码点的可见显示的字形,否则当不受支持时将呈现为不可见。

更多资源(必读,不完整):

  • {{link2:Default_Ignorable_Code_Point字符属性}}
  • 第5.21节,“处理中忽略字符”在{{link3:实施指南}}中
  • {{link4:Emoji标签序列}}

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