探索字体属性和字形度量

PythonPythonBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,你将了解 .FT2Font 对象的属性,这些属性描述了全局字体属性。你还将学习如何使用 .load_char 返回的 .Glyph 对象来使用单个字符指标。

虚拟机提示

虚拟机启动完成后,点击左上角切换到 “笔记本” 标签,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,请随时向 Labby 提问。课程结束后提供反馈,我们将立即为你解决问题。

导入必要的库

在这一步中,我们将导入必要的库。

import os
import matplotlib
import matplotlib.ft2font as ft

加载字体

在这一步中,我们将加载要使用的字体。我们将使用 Matplotlib 附带的一种字体。

font = ft.FT2Font(
    os.path.join(matplotlib.get_data_path(),
                 'fonts/ttf/DejaVuSans-Oblique.ttf'))

打印字体属性

在这一步中,我们将打印字体的属性。

print('Num faces:  ', font.num_faces)        ## 文件中的面数
print('Num glyphs: ', font.num_glyphs)       ## 面中的字形数
print('Family name:', font.family_name)      ## 面的字体族名称
print('Style name: ', font.style_name)       ## 面的字体样式名称
print('PS name:    ', font.postscript_name)  ## PostScript 名称
print('Num fixed:  ', font.num_fixed_sizes)  ## 嵌入式位图的数量

打印其他字体属性

在这一步中,我们将打印仅在字体面可缩放时才可用的其他字体属性。

if font.scalable:
    ## 字体面的全局边界框 (xmin, ymin, xmax, ymax)
    print('Bbox:               ', font.bbox)
    ## EM 所覆盖的字体单位数量
    print('EM:                 ', font.units_per_EM)
    ## 以 26.6 个单位表示的上行线高度
    print('Ascender:           ', font.ascender)
    ## 以 26.6 个单位表示的下行线高度
    print('Descender:          ', font.descender)
    ## 以 26.6 个单位表示的高度
    print('Height:             ', font.height)
    ## 最大水平光标前进距离
    print('Max adv width:      ', font.max_advance_width)
    ## 垂直布局时同理
    print('Max adv height:     ', font.max_advance_height)
    ## 下划线的垂直位置
    print('Underline pos:      ', font.underline_position)
    ## 下划线的垂直厚度
    print('Underline thickness:', font.underline_thickness)

打印字体样式

在这一步中,我们将打印字体样式。

for style in ('Italic',
              'Bold',
              'Scalable',
              'Fixed sizes',
              'Fixed width',
              'SFNT',
              'Horizontal',
              'Vertical',
              'Kerning',
              'Fast glyphs',
              'Multiple masters',
              'Glyph names',
              'External stream'):
    bitpos = getattr(ft, style.replace(' ', '_').upper()) - 1
    print(f"{style+':':17}", bool(font.style_flags & (1 << bitpos)))

总结

在这个实验中,你学习了 .FT2Font 对象中描述全局字体属性的那些属性。你还学习了如何使用 .load_char 返回的 .Glyph 对象来使用单个字符的度量信息。