You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从Zip压缩包直接加载字体到Matplotlib?

直接从Zip包加载字体到Matplotlib的解决方案

核心思路

Matplotlib支持通过字体字节流直接注册字体,无需提前解压到本地文件。结合zipfile读取压缩包内的字体文件流,再用Fonttools解析字体元信息,就能实现无解压加载字体的需求。

具体实现步骤

  1. 用zipfile.ZipFile打开目标压缩包,读取指定字体文件的字节数据
  2. 通过Fonttools解析字体,提取字体名称等元信息(方便后续调用识别)
  3. 将字体字节数据注册到Matplotlib的字体管理器中
  4. 在绘图时直接调用已注册的字体

代码示例

import zipfile
import io
from fontTools.ttLib import TTFont
from matplotlib.font_manager import FontManager
import matplotlib.pyplot as plt

def load_font_from_zip(zip_path, font_filename):
    # 读取Zip包内的字体字节流
    with zipfile.ZipFile(zip_path, 'r') as zf:
        if font_filename not in zf.namelist():
            raise FileNotFoundError(f"字体文件 {font_filename} 不存在于压缩包中")
        font_data = zf.read(font_filename)
    
    # 用Fonttools解析字体,提取正式名称
    ttfont = TTFont(io.BytesIO(font_data))
    font_name = ttfont['name'].getDebugName(4)
    
    # 注册字体到Matplotlib
    fm = FontManager()
    font_prop = fm.add_font(
        fontfile=None,
        fontdata=font_data,
        name=font_name
    )
    return font_prop

# 示例:加载并使用字体
if __name__ == "__main__":
    # 替换为你的Zip包路径和字体文件名
    font_prop = load_font_from_zip("large_fonts.zip", "NotoSansSC-Regular.ttf")
    
    # 测试绘图
    plt.figure(figsize=(8, 4))
    plt.text(0.5, 0.5, "这是从Zip包加载的字体测试", 
             fontproperties=font_prop, fontsize=24, ha='center')
    plt.axis('off')
    plt.show()

注意事项

  • 若需批量加载压缩包内的所有字体,可遍历zf.namelist()筛选出.ttf/.otf等格式文件,逐个注册
  • 注册后的字体可通过FontManager().get_font_names()查看是否成功添加
  • 首次注册字体需要解析字节流,会有少量耗时,但后续绘图无需重复读取Zip包,符合性能要求
  • 确保Fonttools和Matplotlib版本兼容(建议使用较新版本的库)

内容的提问来源于stack exchange,提问作者Lukas W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:54:56