Python PIL:字体的粗细和样式

9

在我的电脑上,似乎只有一个Ubuntu Condensed字体文件。即:

/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-C.ttf 

然而,在LibreOffice中,我可以将此字体设置为粗体和斜体: enter image description hereUbuntu字体测试器网页上,我也可以为Ubuntu Condensed系列设置不同的字重(即常规和粗体)和不同的字形(即正常和斜体)。在CSS中,这可能会转化为:
/* CSS for bold and italic Ubuntu Condensed font */
font-family: Ubuntu Condensed;
font-style: italic;
font-weight: 700;

或者:

/* CSS for regular and normal Ubuntu Condensed font */
font-family: Ubuntu Condensed;
font-style: normal;
font-weight: 400;

然而,当涉及到Python的PIL/Pillow时,我无法在ImageFont中找到任何有效的选项来修改字体的样式和/或粗细,除了使用ImageFont.truetype()函数加载不同的字体文件。
对于“常规”Ubuntu字体(非Condensed),我可以加载四个单独的文件之一,在Python中获得正常、粗体、斜体和粗斜体样式。
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-R.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-RI.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-B.ttf
/usr/share/fonts/truetype/ubuntu-font-family/Ubuntu-BI.ttf

但是Ubuntu Condensed字体无法实现加粗或斜体。

所以问题是,是否有可能在PIL/Pillow中使用加粗和/或斜体的Ubuntu Condensed字体绘制图像?或者至少是否有可能生成四个Ubuntu Condensed文件,以便可以像从Python使用Ubuntu字体一样使用它?


你有尝试过 ImageFont 模块吗?它具有 load()TrueType() 函数,在这里可能会很有用。 (编辑:这里是文档!) - ladygremlin
@ladygremlin,我可能已经做了。但我仍然不知道如何为Ubuntu Condensed提供一个文件Ubuntu-C.ttf,然后选择我想要的样式(比如斜体或正常)。似乎没有这方面的选项。 - Andriy Makukha
1个回答

6

您可以使用方法set_variation_by_name选择所需的字体变体。

要获取所有变体,请使用方法get_variation_names,它应该会给您一个名称列表。

>>> from PIL import ImageFont
>>> 
>>> font = ImageFont.truetype(...)
>>> font.get_variation_names()
[b'Normal', b'Bold', b'Italic', b'Bold, Italic']
>>> font.set_variation_by_name('Italic')

这将为您提供所需的字体变体。

1
你能展示一下 import 语句吗?这样大家就能看到你从哪里获取这些函数了。 - Mark Setchell
2
感谢您的回复。然而,到目前为止我还无法使其工作:在Ubuntu上使用Pillow 6.2.0时,我得到了File "/userhome/34/amakukha/anaconda3/lib/python3.7/site-packages/PIL/ImageFont.py", line 497, in get_variation_names names = self.font.getvarnames() OSError: invalid argument的错误。在MacOS上使用Pillow 7.1.1时也出现了类似的错误。 - Andriy Makukha
这很奇怪。你能否至少使用方法 font.get_variation_axes() 找出字体如何更改? - Friedrich
@AndriyMakukha 这将允许您使用文档在此处记录的方法 font.set_variation_by_axes(...) https://pillow.readthedocs.io/en/stable/reference/ImageFont.html#PIL.ImageFont.FreeTypeFont.set_variation_by_axes。 - Friedrich
3
根据文档,如果字体文件只包含一个变体,则会引发“OSError”错误。这意味着该字体不是“可变字体”。如果其他变体在别处可用,则它们可能存储在单独的文件中。例如,在Windows上,Arial字体有独立的文件用于存储常规、粗体、斜体、粗斜体等变体。 - Reign of Error
显示剩余2条评论

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