桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载FontForge 是一款自由开源的字体编辑器而其 Python 绑定模块让开发者能够以纯代码的方式创建、编辑、转换字体彻底摆脱 GUI 的手工操作。本文基于仓库中的 PyPI 分发说明 README_PYPI.md结合 pyhook 扩展源码、pyproject.toml 打包配置与测试用例系统讲解fontforge与psMat两个 Python 模块的安装方式、核心 API 用法、底层实现原理以及从源码构建 wheel 的完整流程。读完本文你将能直接用 Python 完成字体创建、字形绘制、格式转换与批量处理并理解该模块在 C 扩展层面的工作原理。一、认识 FontForge Python 模块FontForge 的 Python 绑定将整个字体引擎包括解析、编辑、光栅化与生成逻辑以原生扩展模块的形式暴露给 Python。与完整的 FontForge GUI 应用程序不同本 PyPI 包只安装 Python 模块不含图形界面。这意味着它天然适合 CI、命令行工具、字体自动化流水线等场景无需任何窗口环境即可在服务器或容器中完成字体处理任务。该包安装后提供两个顶层模块模块作用fontforge主字体操作模块提供字体、字形、图层、画笔pen、OpenType 特性等全部对象psMatPostScript 变换矩阵工具用于生成缩放、旋转、平移、斜切等矩阵并作用于字形两者的关系在源码中有清晰体现pyhook/CMakeLists.txt 中同时构建fontforge_pyhook与psMat_pyhook两个扩展库分别以fontforge和psMat作为输出模块名在 Windows 上则生成对应的.pyd文件。而 pyhook/fontforgepyhook.c 与 pyhook/psMatpyhook.c 中两个PyInit_*入口最终都调用了同一个初始化函数fontforge_python_init定义于 fontforge/python.cpp因此两个模块共享同一套字体引擎运行时。安装方式与平台支持pip install fontforge当目标平台存在预编译 wheel 时pip会直接下载安装无需任何额外的 Python 依赖——所需的原生库FreeType、libxml2、zlib 等都已随 wheel 一并打包。预编译 wheel 支持的平台如下Linuxx86_64、aarch64基于 manylinux_2_28即 RHEL 8 系构建macOSx86_64、arm64macOS 11.0部署目标在打包配置中统一设为 11.0Windowsx86_64仅 64 位需 MSVC 工具链构建如果当前平台没有对应的 wheelpip会尝试从源码构建。此时系统需要满足CMake 3.15C/C 编译器FreeType、libxml2、zlib 的开发头文件关于从源码构建的完整说明见仓库根目录的 INSTALL.md。需要说明的是从仓库内 WHEEL_BUILD_STATUS.md 的实现清单看Initial PyPI release首次正式发布仍处于未勾选状态因此在部分平台可能找不到可用 wheel此时按上述依赖准备构建环境即可。二、快速上手创建字体、绘制字形与导出README_PYPI.md给出了一个完整的从零建字流程下面逐行展开讲解。import fontforge # 创建一个空白字体 font fontforge.font() font.familyname MyFont font.fontname MyFont-Regularfontforge.font()创建一张全新的空字体familyname与fontname分别设置字体家族名和内部字型名PostScript 名称这两个属性会写入最终输出的字体 name 表。对应源码位置createChar方法在 fontforge/python.cpp 中注册为 Creates a (blank) glyph at the specified unicode codepoint即按 Unicode 码点创建空白字形。# 创建一个字形字母 A glyph font.createChar(ord(A)) pen glyph.glyphPen() # Draw the glyph...createChar(ord(A))按码点创建字形对象glyphPen()返回一个可绘制轮廓的画笔对象在源码中以PyFF_GlyphPenType实现见 fontforge/python.cpp你可以通过pen.moveTo()、pen.lineTo()、pen.curveTo()等命令逐段勾勒字形轮廓完成后调用pen None结束绘制。# 打开一个已有的字体文件 font fontforge.open(path/to/font.ttf) # 遍历访问字形 for glyph in font.glyphs(): print(glyph.glyphname, glyph.unicode)fontforge.open()是模块级函数在 fontforge/python.cpp 的方法表中注册为 Opens a font and returns it支持 OTF、TTF、UFO、Type1、WOFF 等多种格式。font.glyphs()返回可迭代的字形集合每个字形对象暴露glyphname字形名与unicode码点等属性适合做全字库扫描与分析。# 导出字体文件 font.generate(output.otf)font.generate()按扩展名推断目标格式并生成文件是格式转换的核心入口。把它与fontforge.open()组合即可实现一行式的批量格式转换详见后文批量处理。三、核心能力一览README_PYPI.md归纳了该模块的主要能力结合源码进一步说明如下字体格式读写OTF、TTF、UFO、Type1、WOFF、WOFF2 等。仓库中fontforge目录下的 parsettf.c、tottf.c、woff2.cc 等文件分别承担 TrueType 解析、生成与 WOFF2 压缩/解压的底层实现。字形编辑以代码创建和修改字形轮廓glyph outline。字形、图层、轮廓、锚点等对象在 fontforge/python.cpp 中均有对应的 Python 类型定义如PyFF_GlyphType、PyFF_ContourType、PyFF_LayerType能力与 GUI 中的编辑模型一致。OpenType 特性构建与操作 GSUB/GPOS 表。底层由 featurefile.c特性文件解析与 tottfgpos.c、tottfaat.cGPOS/GSUB 表生成支撑。字体转换在各种格式之间互转即open()generate()的组合。度量与字距设置左右边距sidebearings、创建 kerning 对。字形对象的width、leftsidebearing、rightsidebearing属性与addKerningClass等方法是常用入口。校验检查字体的常见问题。GUI 侧的 Find Problems 逻辑对应 fontforgeexe/gtk/find_problems.cppPython 侧可通过字形属性与方法做等价检查。批量处理跨多个字体编写脚本化操作是 CI 流水线中最典型的用法见下文示例。四、psMatPostScript 变换矩阵工具第二个随包安装的模块psMat提供矩阵运算函数用于构造变换矩阵并作用于字形图层。官方示例为import fontforge import psMat # 创建 2 倍缩放矩阵 matrix psMat.scale(2.0) # 应用到字形图层 glyph.transform(matrix)psMat提供scale、translate、rotate、skew等矩阵构造函数返回可直接传给glyph.transform()的矩阵对象。该模块同样注册在 fontforge/python.cpp 的module_psMat_methods方法表中复用同一套字体运行时。组合多个变换时可以先将矩阵相乘得到复合变换m psMat.compose(psMat.scale(2.0), psMat.translate(100, 0)) glyph.transform(m)五、底层实现C 扩展如何工作fontforge与psMat并非纯 Python 实现而是封装底层 C 引擎的原生扩展。理解其结构有助于排查环境问题、评估二次开发成本。1. 扩展入口与运行时初始化pyhook/fontforgepyhook.c 定义了模块入口PyInit_fontforge其唯一职责是调用fontforge_python_init(fontforge)pyhook/psMatpyhook.c 同理传入模块名psMat。真正的初始化逻辑集中在 fontforge/python.cpp 的fontforge_python_init中调用doinitFontForgeMain()初始化字体引擎主程序将no_windowing_ui与running_script置为true即显式声明当前运行于无界面脚本模式——这正是该模块无需显示环境即可工作的关键调用CreateAllPyModules()创建全部 Python 类型对象并注册内部模块。在 Linux/macOS 上pyhook/fontforgepyhook.c 还会定义一个强符号ff_is_pyhook_context()返回 1用以覆盖共享库libfontforge中的弱符号标记当前处于 Python 钩子上下文。2. 模块级方法与字体对象模块级方法fontforge.open、fontforge.fonts、fontforge.version、fontforge.getPrefs等集中声明在 fontforge/python.cpp 的module_fontforge_methods表中而字体对象的方法如createChar、glyphPen、transform、generate则位于PyFF_Font_methodsfontforge/python.cpp。从源码结构可以推断所有 Python 对象都直接映射到字体引擎内部的 SplineFont/Glyph 等数据结构因此 Python 侧的任何改动都等价于引擎级改动这也是该模块与 GUI 行为一致的根本原因。3. 冒烟测试验证仓库中 tests/pyhook_smoketest.py 是最简可用性验证import fontforge import psMat import pickle print(fontforge.__version__, fontforge.version()) fontforge.font() print(pickle.loads(pickle.dumps(fontforge.point())))该脚本依次验证了模块导入、版本号输出、空字体创建以及字体内部对象point的 picklability。wheel 构建流程pyproject.toml 中的 cibuildwheel 配置也内置了等价检查python -c import fontforge; import psMat; print(fontforge, fontforge.version())六、从源码构建wheel 打包机制当没有现成 wheel 时pip install fontforge会经由 pyproject.toml 定义的 scikit-build-core 后端完成CMake 配置 → 编译扩展 → 打包的完整流程。关键配置如下[build-system] requires [scikit-build-core0.5] build-backend scikit_build_core.build [tool.scikit-build] cmake.args [ -DENABLE_GUIOFF, -DENABLE_PYTHON_SCRIPTINGON, -DENABLE_PYTHON_EXTENSIONON, -DENABLE_NATIVE_SCRIPTINGOFF, -DENABLE_DOCSOFF, -DBUILD_SHARED_LIBSON, ] cmake.build-type Release cmake.version 3.15这些参数说明 wheel 构建刻意关闭 GUI 与原生脚本、文档只启用 Python 扩展并共享链接fontforge引擎库以控制体积。ENABLE_LIBSPIRO、ENABLE_WOFF2等可选特性可通过[tool.scikit-build.cmake.define]打开。对应地pyhook/CMakeLists.txt 在 wheel 构建模式下BUILDING_WHEEL为扩展设置$ORIGINRPATH使fontforge.so能在同一目录下找到libfontforge并将产物直接安装到 wheel 根目录。版本号CalVer 自动生成模块版本采用日历版本CalVer策略由 _build_meta/version_provider.py 实现它读取根目录 CMakeLists.txt 中project(fontforge VERSION YYYYMMDD ...)的 8 位日期转换为YYYY.M.D格式例如20251009→2025.10.9。这意味着每次发布无需手动维护版本号构建日期即版本号。多平台 wheel 矩阵tool.cibuildwheel 部分定义了各平台的构建矩阵与README_PYPI.md中声明的平台支持一一对应Linux使用manylinux_2_28基础镜像先yum installfreetype/libxml2/zlib 等开发包再用auditwheel repair修复 wheelWHEEL_BUILD_STATUS.md 注明 libspiro 与 libunibreak 因不在默认仓库而暂未启用macOS分别为x86_64与arm64构建通过 Homebrew 安装依赖用delocate-wheel修复WindowsAMD64架构借助 vcpkg 安装依赖freetype、libxml2、libiconv、zlib、libpng、libjpeg-turbo、tiff用delvewheel收集 DLL 完成修复。七、安全注意事项务必阅读README_PYPI.md明确给出安全警告FontForge 面向可信字体文件的交互式使用设计代码库存在包括缓冲区溢出在内的已知漏洞可能造成崩溃甚至被利用。因此切勿在未做严格沙箱隔离的情况下处理不可信输入如用户上传的字体文件在服务端、Web 应用等场景中使用时应将字体解析过程放入隔离的进程、容器或虚拟机中执行优先只处理来源可靠的字体文件。八、文档与许可Python 脚本编程的完整指南位于仓库内 doc/sphinx/scripting对应 Sphinx 文档的 scripting 分册含 Python API 参考GUI 应用相关说明见 doc/sphinx/ui。许可协议FontForge 遵循 GPLv3 许可本 Python 包在 pyproject.toml 中声明为GPL-3.0-or-later完整文本见仓库根目录 COPYING.gplv3。项目整体介绍与开发说明见 README.md 与 INSTALL.md。九、实战批量格式转换脚本综合以上 API一个典型的批量处理脚本如下可递归转换目录下的所有 TTF 字体为 OTF/WOFF2import os import fontforge def convert_dir(src_dir, out_dir): os.makedirs(out_dir, exist_okTrue) for name in os.listdir(src_dir): if not name.lower().endswith(.ttf): continue src os.path.join(src_dir, name) base os.path.splitext(name)[0] font fontforge.open(src) for ext, flags in ((otf, (opentype,)), (woff2, (woff2,))): out os.path.join(out_dir, f{base}.{ext}) font.generate(out, flagsflags) font.close() print(fconverted: {name}) convert_dir(fonts/, out/)把该脚本与前述模块级 APIopen、generate配合即可在无 GUI 环境下完成字体资产的批量加工这也是fontforge包在自动化管线中最常见的落地场景。赞分享桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载相关推荐FontForge Python 扩展模块构建全解从源码到 PyPI Wheel 的工程实践FontForge Python 扩展模块构建全解从源码到 PyPI Wheel 的工程实践 导读 本文以仓库文档 doc/sphinx/scripting/桌面应用图形学FontForge Python 脚本编程指南fontforge 与 psMat 模块、命令行用法与 pip 扩展安装FontForge Python 脚本编程指南fontforge 与 psMat 模块、命令行用法与 pip 扩展安装 FontForge 在自身 C 引擎之桌面应用图形学FontForge 从源码构建与安装完整指南CMake/Ninja 构建流程、Python 模块与 TrueType 提示调试器详解FontForge 从源码构建与安装完整指南CMake/Ninja 构建流程、Python 模块与 TrueType 提示调试器详解 FontForge 是一桌面应用图形学创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
m3u8下载解析与TS合成完整指南 简介:本资源是一份面向Python开发者与音视频处理初学者的m3u8流媒体下载工具脚本,解决HLS协议下在线视频无法直接保存为MP4的常见痛点,适用于课程录播、技术分享类视频的离线存档与二次处理场景。压缩包为2KB的ZIP文件,仅含1个核心… · 2026/9/27 0:30:30
闭站保护期间网站能够打开吗 3个维度对比评测避坑 闭站保护期间网站能够打开吗 3个维度对比评测避坑 域名服务器搞不懂?别慌,这行十年,见过太多老板在闭站保护期卡壳。做对比评测时,发现90%的人搞错了一个核心概念: 闭站保护不是断网,而是特定状态下的访问控制。… · 2026/9/27 0:30:30
新乡手机网站建设哪家专业?从零搭建防黑指南 新乡手机网站建设哪家专业?从零搭建防黑指南 域名和服务器配置让人头大?新乡手机网站建设哪家专业?这问题背后,其实是你对“从零搭建”安全基底的焦虑。很多老板以为建站就是买模板、传文件,结果上线三天就被挂了木马,或者后台被植入广告。在新乡本地找… · 2026/9/27 0:30:10
深圳杯D题建模全链路:小波去噪、STR分解与GBDT实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:10:43
N76E003开发环境搭建全攻略:Keil C51与Nu-Link驱动配置指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:10:43
国产MCU烧录实战:HC32、GD32、FM33在JFlash下的配置与排障 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:10:43
STM32CubeMX 6.14完整使用教程:从安装配置到工程生成与常见坑解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:10:43
VisDrone转COCO格式JSON实战:无人机目标检测数据标注转换与避坑指南 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/27 1:10:43
鸿蒙React Native搜索页卡顿优化:useMemo缓存结果实战 1. 搜索页卡顿在鸿蒙端被放大了:先还原现场我先把背景交代清楚。我们团队在做资讯类App的鸿蒙适配,React Native版本用的0.72,通过HarmonyOS的RN适配层跑原生渲染链路。首页、详情页迁移都算顺利,唯独搜索页在输入关键词时掉帧严重… · 2026/9/27 1:10:37
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01