使用PIL如何绘制粗体/斜体文本?

33

如何使用PIL绘制粗体/斜体文本?ImageFont.truetype(file, size)只有指定字体大小的选项。

6个回答

29

使用字体的粗体/斜体版本


16
需要澄清的是:每个字体版本都有一个单独的文件,例如:Arial.ttf,ArialBold.ttf等。 - btk
如果您使用的是Mac电脑,您可以从Font Book.app中找到字体文件。只需右键单击字体名称,然后点击“在Finder中显示”。您可以检查文件路径,然后将字体文件拖到Terminal.app上。 - Nori

10

到目前为止,还没有将粗体功能作为参数,但您可以通过向文本添加与文本相同颜色的描边来轻松解决此问题。这将使其看起来像是粗体字体。下面的代码将详细说明如何使用描边。

    draw.text((x, y), text, fill=color, font=font, stroke_width=2,
          stroke_fill="black")

9

如果(出于某种原因)您没有单独的粗体字体,那么一种相当hacky的解决方案是使用微小的偏移量多次打印相同的文本,从而使字体加粗。

andaleMono = ImageFont.truetype(ANDALE_MONO_PATH,16)
text = "hello world"
mainOffset = (50,50)
xoff, yoff = mainOffset
draw.text(mainOffset,text,font=andaleMono,fill='black')
draw.text((xoff+1,yoff+1),text,font=andaleMono,fill='black')
draw.text((xoff-1,yoff-1),text,font=andaleMono,fill='black')

在大尺寸的图片中,文本会变得混乱不清。 - Mosi

7
许多字体使用不同的TTF文件来表示它们的粗体/斜体版本,因此我认为如果您只指定该文件,它应该可以工作。

在Windows中并不明显,因为资源管理器对每种字体(例如Times New Roman)显示一个“文件”,但是如果你使用控制台浏览字体,你会发现每种字体样式实际上对应一个文件,例如times.ttftimesbd.ttftimesbi.ttftimesi.ttf - undefined

3

好的,这是我的第一条评论。我们开始吧。

我会尝试澄清这个过程。首先,我使用了字体的“名称”,如下所示:

font = ImageFont.truetype("C:\Windows\Fonts\\Arial Negrita.ttf",25)

但是只得到了一些类似这样的错误信息:
    Traceback (most recent call last):
  File "C:/Users/555STi/PycharmProjects/PIL/img.py", line 8, in <module>
    font = ImageFont.truetype("C:\Windows\Fonts\Arial negrita.ttf",25)
  File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 262, in truetype
    return FreeTypeFont(font, size, index, encoding)
  File "C:\Python27\lib\site-packages\PIL\ImageFont.py", line 142, in __init__
    self.font = core.getfont(font, size, index, encoding)
IOError: cannot open resource

我想起有些字体有其他“名称”或“文件名”,于是我进入字体文件夹,然后打开Arial字体,它显示了所有的样式,如negrita(加粗),cursiva(斜体)等。

在“negrita”样式上右键单击,选择“属性”,然后会显示字体的“实际名称”。

在我的情况下,名称为“ariblk”。

最后,只需像这样使用该名称即可。

font = ImageFont.truetype("C:\Windows\Fonts\\ariblk.ttf",25)

我知道这篇帖子很老,但今天它帮助我找到了解决方案。所以我希望能帮到任何人。

=)


这个回答解决了提问者的问题吗? - Nilambar Sharma
@Nilambar,你是什么意思?抱歉,我在这里还比较新。 - Николаи Милош
1
@NikolaiMilos的意思是原帖发布者(OP)询问了一些相当具体的问题。你正在回答这个问题:“为什么我加载Arial Negrita字体时会出现错误?”如果你重新阅读问题,你会发现它完全不同。 - Paragon
不回答问题 - Aniket Singla

0
关于这里其他答案的参考,我搜索Arial粗体变种的名称得到了以下结果(arialbd.ttf):
def FindFontsVariantsWithBase(fontBase="arial"):
        import matplotlib
        system_fonts = matplotlib.font_manager.findSystemFonts(fontpaths=None, fontext='ttf')
        # for font in np.sort(system_fonts):
        #     print(font)
        fonts = np.sort(system_fonts).tolist()
        res = [i for i in fonts if fontBase in i]
        print(res)
        
FindFontsVariantsWithBase("arial")

['C:\WINDOWS\Fonts\arial.ttf', 'C:\WINDOWS\Fonts\arialbd.ttf', 'C:\WINDOWS\Fonts\arialbi.ttf', 'C:\WINDOWS\Fonts\ariali.ttf', 'C:\Windows\Fonts\arial.ttf', 'C:\Windows\Fonts\arialbd.ttf', 'C:\Windows\Fonts\arialbi.ttf', 'C:\Windows\Fonts\ariali.ttf'] (

['C:\WINDOWS\Fonts\arial.ttf', 'C:\WINDOWS\Fonts\arialbd.ttf', 'C:\WINDOWS\Fonts\arialbi.ttf', 'C:\WINDOWS\Fonts\ariali.ttf', 'C:\Windows\Fonts\arial.ttf', 'C:\Windows\Fonts\arialbd.ttf', 'C:\Windows\Fonts\arialbi.ttf', 'C:\Windows\Fonts\ariali.ttf'] (


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