Squashed 'paste-framework/' content from commit 34e8684
git-subtree-dir: paste-framework git-subtree-split: 34e8684c4bc3cebbe177509f42ab4ef5b5425a7a
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
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
|
||||
Reference in New Issue
Block a user