python 未使用PIL自定义字体替代字形

wi3ka0sx  于 2022-11-28  发布在  Python
关注(0)|答案(2)|浏览(183)

我制作了一个自定义的手写字体,并将其导出到一个.ttf文件。我使用的服务Caligriphr允许为每个字符提供替代字形。当我在记事本中使用该字体键入时,替代字形可以正确显示。但是,当我使用PIL和自定义字体在图像上写入文本时,每个字符只使用一个字形。下面是我在图像上写入的代码:

body = ""
with open('body.txt') as fin:
    ls = fin.readlines()
    for l in ls:
        words = l.split(' ')
        for word in words:
            double = random.randint(1,2) == 2
            if(double):
                body += '  ' + word
            else:
                body += ' ' + word
image = Image.open('graph.jpg').convert("RGBA")
text = Image.new('RGBA', image.size, (255,255,255,0))
font = ImageFont.FreeTypeFont('Graphite.ttf', 100)
d = ImageDraw.Draw(text)
d.text(xy=offset, text=body, fill = (26,29,32, 230), font=font)
tilt = random.random() * 2
slt = text.rotate(tilt, expand=1)
sx, sy = slt.size
image.paste(slt, (0,0, sx, sy), slt)
image.save('sample.png')

编辑:显示如何构造正文字符串的代码
任何帮助都将不胜感激。
Alternate Glyphs Displayed in Notepad
PIL output not utilizing alternate glyphs

wn9m85ua

wn9m85ua1#

这可能取决于您使用的是原始PIL库还是Pillow库。
要在绘制输出中获取上下文替代字形,渲染引擎需要将字符串绘制为整个字符串(而不是逐个字符),并且在执行此操作时,需要处理字体中的某些数据,这些数据将从默认字形执行字形替换。
此数据可以是OpenType字体中的OpenType Layout表格、Apple TrueType字体中的AAT表格或Graphite字体中的Graphite表格,具体取决于平台/库支持的内容。既然您提到在记事本中有替代项,则表明该字体具有OpenType Layout数据。
阅读Pillow ImageFont文档,它没有给予任何关于它是否支持这些字体格式的指示。但是,查看Pillow project in Github,我看到[winbuild\config.py]引入了Harfbuzz,这将提供对OpenType布局数据的支持。因此,看起来Pillow应该使用上下文替代字形进行绘制,虽然我不知道是否需要任何东西来触发它。(在记事本中,它是默认的,但并不是在任何地方都是这样。)

owfi6suc

owfi6suc2#

如果使用Pillow,则在加载字体时可能需要显式启用Raqm布局引擎:“Raqm -用于复杂文本布局的库”http://host-oman.github.io/libraqm/raqm-Raqm.html
可以使用ImageFont.truetype()函数指定此引擎:

font = ImageFont.truetype('Graphite.ttf', 100, layout_engine=ImageFont.LAYOUT_RAQM)

文件:https://pillow.readthedocs.io/en/stable/reference/ImageFont.html#PIL.ImageFont.truetype
测试系统上是否有Raqm可用:

>>> from PIL import features
>>> features.check('raqm')
True

如果没有,请在我的Ubuntu 20上通过

$ sudo apt install libraqm0

编辑:看起来你根本不需要指定layout_engine参数。在我的系统上,只要我安装了Raqm库,就可以使用替代的字形,甚至不用修改代码。

相关问题