Skip to content

TTF 字体 glyph 去重工具 - 通过智能去重减小字体文件总体积

License

Notifications You must be signed in to change notification settings

hellsge/font-dedup

Repository files navigation

Font Dedup - TTF 字体 Glyph 去重工具

一个用于分析和优化 TTF 字体文件的命令行工具,通过智能去重减小字体文件总体积。

功能特点

  • 🔍 字体分析: 分析多个字体文件中的 glyph 重复情况
  • 🎯 优先级去重: 根据用户指定的优先级保留 glyph
  • 🎨 字形检测: 智能识别相同 Unicode 码点的字形变体(如 CJK 字符的地区差异)
  • 📊 Unicode 范围过滤: 支持指定特定 Unicode 范围进行去重
  • 🛡️ 排除范围保护: 保护特定范围的 glyph 不被去重
  • 自动验证: 验证生成的字体文件有效性
  • 🇨🇳 中文界面: 输出报告和错误信息使用中文

安装

pip install -e .

开发模式安装(包含测试依赖):

pip install -e ".[dev]"

使用方法

分析字体文件

仅分析字体文件中的重复 glyph,不修改任何文件:

font-dedup analyze font1.ttf font2.ttf font3.ttf

启用字形检测分析(识别字形变体):

font-dedup analyze NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf --shape-analysis

限制字形分析的字符数量(加快分析速度):

font-dedup analyze font1.ttf font2.ttf --shape-analysis --codepoint-limit 100

执行去重

基本去重操作:

font-dedup deduplicate font1.ttf font2.ttf -o ./output

指定字体优先级(font1.ttf 优先级最高):

font-dedup deduplicate font1.ttf font2.ttf -o ./output -p font1.ttf

仅处理中文字符范围:

font-dedup deduplicate font1.ttf font2.ttf -o ./output -r 0x4E00-0x9FFF

排除 ASCII 字符范围:

font-dedup deduplicate font1.ttf font2.ttf -o ./output -e 0x0020-0x007F

自定义输出文件后缀:

font-dedup deduplicate font1.ttf font2.ttf -o ./output -s _optimized

启用字形检测去重(保护字形变体):

font-dedup deduplicate NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf -o ./output --shape-analysis

自定义字形相似度阈值(默认 1.0,即完全相同):

font-dedup deduplicate font1.ttf font2.ttf -o ./output --shape-analysis --similarity-threshold 0.95

工作原理

  1. 解析字体: 使用 fonttools 解析 TTF 文件,提取 glyph 和 Unicode 映射信息
  2. 检测重复: 分析多个字体间的 code point 重叠情况
  3. 字形分析(可选): 提取字形轮廓数据,计算相似度,识别字形变体
  4. 优先级去重: 根据优先级顺序,从低优先级字体中移除重复 glyph
  5. 生成字体: 使用 fonttools subsetting 功能生成优化后的字体文件
  6. 验证输出: 验证生成的字体文件格式正确且所有保留的 glyph 可访问

字形检测功能

字形检测功能专门用于处理 CJK(中日韩)字体等存在地区字形差异的场景。相同的 Unicode 码点在不同地区可能有不同的字形设计:

  • 简体中文 (SC) vs 韩文 (KR): 许多汉字有不同的笔画风格
  • 日文 (JP) vs 繁体中文 (TC): 部分汉字的写法存在差异

启用字形检测后,工具会:

  1. 提取每个字符的轮廓数据
  2. 计算字形相似度(默认使用严格相等检查)
  3. 识别字形变体并在所有字体中保留
  4. 仅去重真正相同的字形

性能说明: 字形分析需要提取和比较轮廓数据,对于包含数千字符的 CJK 字体可能需要较长时间。建议:

  • 首次分析时使用 --codepoint-limit 参数快速评估
  • 使用 --range 参数限制分析范围
  • 对于生产环境,可以缓存分析结果

使用示例

示例 1: 基本去重

假设你有三个字体文件,想要去除重复的 glyph:

# 分析重复情况
font-dedup analyze NotoSans-Regular.ttf NotoSans-Light.ttf

# 执行去重(NotoSans-Regular.ttf 优先级更高)
font-dedup deduplicate NotoSans-Regular.ttf NotoSans-Light.ttf -o ./output -p NotoSans-Regular.ttf

示例 2: CJK 字体字形检测

处理中日韩字体时,启用字形检测以保护地区字形差异:

# 分析字形变体
font-dedup analyze NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf --shape-analysis --codepoint-limit 50

# 执行字形检测去重
font-dedup deduplicate NotoSansSC-Bold.ttf NotoSansKR-Bold.ttf -o ./output --shape-analysis

示例 3: 仅处理中文字符范围

只对 CJK 统一表意文字进行去重:

font-dedup deduplicate font1.ttf font2.ttf -o ./output -r 0x4E00-0x9FFF

示例 4: 保护 ASCII 字符

去重时保护 ASCII 字符不被删除:

font-dedup deduplicate font1.ttf font2.ttf -o ./output -e 0x0020-0x007F

技术栈

  • Python 3.10+
  • fonttools: 字体文件解析和处理(包括轮廓数据提取)
  • click: 命令行接口
  • pytest + hypothesis: 单元测试和属性测试框架

开发

获取测试字体

测试需要使用 TTF 字体文件。你可以从 Google Fonts 下载 Noto Sans 系列字体:

将下载的 TTF 文件放在项目根目录即可运行测试。

运行测试

运行所有测试(不包括慢速 CJK 测试):

pytest -m "not cjk"

运行所有测试(包括 CJK 字形检测测试):

pytest

仅运行 CJK 字形检测测试:

pytest -m cjk

运行测试并查看覆盖率:

pytest --cov=src/font_dedup

注意: CJK 字形检测测试需要较长时间(1-2 分钟),因为需要分析大型字体文件的轮廓数据。

项目结构

font-dedup/
├── src/font_dedup/
│   ├── analyzer.py          # 字体分析器
│   ├── shape_analyzer.py    # 字形分析器(轮廓提取和相似度计算)
│   ├── engine.py            # 去重引擎(支持字形检测)
│   ├── generator.py         # 字体生成器
│   ├── validator.py         # 验证器
│   ├── reporter.py          # 报告生成器(支持字形变体报告)
│   ├── models.py            # 数据模型
│   ├── cli.py               # 命令行接口
│   └── utils.py             # 工具函数
├── tests/                   # 测试文件
│   ├── test_cjk_fonts.py    # CJK 字体测试(标记为慢速测试)
│   └── test_shape_detection_integration.py  # 字形检测集成测试
├── .kiro/specs/             # 功能规格文档
└── pyproject.toml           # 项目配置

许可证

项目代码

本项目代码使用 MIT License。

测试字体

测试使用的 Noto Sans 字体文件(位于 fonts/ 目录和项目根目录)使用 SIL Open Font License (OFL) 1.1

这些字体文件仅用于测试目的,不包含在软件分发包中。

作者

hellsge (hellsge@qq.com)

About

TTF 字体 glyph 去重工具 - 通过智能去重减小字体文件总体积

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages