4729698049
git-subtree-dir: paste-framework git-subtree-split: 34e8684c4bc3cebbe177509f42ab4ef5b5425a7a
58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
from matplotlib import pyplot as plt
|
|
from matplotlib.font_manager import fontManager, FontProperties
|
|
|
|
|
|
def get_fonts():
|
|
"""
|
|
取得系统字体,并与要采用的字体合并后,取得可用字体。
|
|
"""
|
|
# 系统所有可用字体
|
|
os_fonts = {f.name for f in fontManager.ttflist}
|
|
# 自定义字体,优先级按顺序排列
|
|
custom_fonts = (
|
|
'PingFang SC', 'Hiragino Sans GB', 'Heiti SC', 'SimSong', 'SimHei',
|
|
'WenQuanYi Micro Hei', 'WenQuanYi Zen Hei', 'Source Han Sans SC',
|
|
'Noto Sans CJK', 'Noto Sans CJK SC', 'DejaVu Sans'
|
|
)
|
|
# 可用字体
|
|
available_font = set(custom_fonts) & os_fonts
|
|
# 字典排序
|
|
available_font = sorted(
|
|
available_font, key=lambda x: custom_fonts.index(x) if x in custom_fonts else len(custom_fonts)
|
|
)
|
|
return available_font
|
|
|
|
|
|
def get_font_metrics(font_name='Microsoft YaHei', font_size=11, dpi=72):
|
|
"""
|
|
使用 matplotlib 获取字体度量信息。
|
|
|
|
:param font_name: 字体名称
|
|
:param font_size: 字号
|
|
:param dpi: 显示像素,像素没英寸
|
|
:return: (英文字符宽度_cm, 中文字符宽度_cm)
|
|
"""
|
|
# 创建高分辨率图形
|
|
fig = plt.figure(figsize=(10, 2), dpi=dpi)
|
|
ax = fig.add_subplot(111)
|
|
ax.axis('off')
|
|
|
|
# 设置字体
|
|
font = FontProperties(family=font_name, size=font_size)
|
|
|
|
# 测试英文字符
|
|
text_en = ax.text(0.1, 0.5, 'aaaaa', fontproperties=font)
|
|
fig.canvas.draw()
|
|
en_width_px = text_en.get_window_extent().width / 5 # 5个字符的平均宽度
|
|
|
|
# 测试中文字符
|
|
text_cn = ax.text(0.1, 0.5, '中中中中中', fontproperties=font)
|
|
fig.canvas.draw()
|
|
cn_width_px = text_cn.get_window_extent().width / 5 # 5个字符的平均宽度
|
|
|
|
plt.close(fig)
|
|
|
|
# 转换为厘米
|
|
px_per_cm = dpi / 2.54
|
|
# 增加100%宽度
|
|
return en_width_px / px_per_cm * 2, cn_width_px / px_per_cm * 2 |