在透明图像上用自定义字体写抗锯齿文本

时间:2019-02-16 22:23:10

标签: python python-3.x python-imaging-library wand pycairo

所以,正如主题所述,我想在透明图像上写一些文本。 或者,更具体地说,我想在多个特定位置写不同的文本。关键是,我想使用自定义字体(coolvetica),并且(并且存在我的问题)我希望它能够消除锯齿。不幸的是,您可能已经知道,PIL不支持字体抗锯齿,但也可以在这里看到: PIL example image. 因此,如您所见,PIL不仅在坐标方面存在问题,而且还不真正支持字体抗锯齿,并且在文本中添加了一些令人讨厌的黑色边框。对我来说不是很有用。 因此,经过一番搜索,我发现了Python Wand。输出要好很多,但是抗锯齿不会导致我想要的结果:Wand example image.曲线不像我想要的那样平滑,并且有些怪异的“丘疹”,例如“ r”末尾的点”。 我使用魔杖的代码是这样的:

with Drawing() as draw:
    with wandimage(filename="Skispringen_Score.png") as img:
        draw.font_family = 'coolvetica.ttf'
        draw.text_antialias = True
        draw.fill_color = (Color("rgba(255, 255, 255, 255)"))
        for postionName, scorePosition in scoreContent.items():
            if isinstance(currentScoreText[postionName], int) and currentScoreText[postionName] > 9:
                center = 2
            else:
                center = 0

            draw.font_size = fontsize[scorePosition["size"]]
            draw.text(scorePosition["x"] - center, scorePosition["y"], str(currentScoreText[postionName]))
            draw(img)
        img.save(filename='wand-image.png')

这是文本实际外观的一个示例:PHP example image. 该图像是用php生成的,文本看起来像我想要的一样平滑。 我也尝试过使用cairo,但是文档确实不是那么好(尤其是很少见的示例),我什至不知道如何用它编写任何文本,也不知道如何设置自定义字体。

实际输出图像的分辨率为1280x720,并且-除了文本之外-完全透明,该图像只是视频流的叠加层。

您是否知道如何使用python将美观的文字添加到图像上?

1 个答案:

答案 0 :(得分:1)

您可以尝试pycairo。以下是一些代码示例https://github.com/pygobject/pycairo/tree/master/examples

cairo的参考文档适用于C。

如果您想要更好的结果,则可以将图像渲染为4倍的大小, 将其下采样到所需大小。

您还可以尝试一些滤镜,例如高斯模糊。

对于像素完美的图像,您将必须使用与php函数相同的渲染引擎。