ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

FontForge psMat 模块全解析:用 PostScript 矩阵驱动字形变换的 Python 实战指南

FontForge psMat 模块全解析:用 PostScript 矩阵驱动字形变换的 Python 实战指南 桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载psMat 是 FontForge 提供的一个轻量 Python 模块封装了字体工程中最常用的仿射变换平移、缩放、旋转、倾斜、复合与求逆全部以 6 元素元组表示的 PostScript 矩阵为统一数据格式。本文以 doc/sphinx/scripting/python/psMat.rst 为骨架结合 fontforge/python.cpp 中该模块的 C 实现与 tests/test1003.py 中的真实调用场景完整讲解每个函数的参数约定、数学含义、边界行为与实战组合用法读完即可在字体批处理脚本中熟练驾驭矩阵变换。psMat 是什么PostScript 矩阵的 Python 封装FontForge 的 Python 脚本体系由两个模块构成——功能庞大的fontforge模块以及小而精的psMat模块后者提供对用 PostScript 矩阵表达的常用变换的快速访问见 doc/sphinx/scripting/python.rst 模块总览。当 FontForge 以 Python 扩展方式构建时psMat会作为一个独立的扩展模块注册pyhook/psMatpyhook.c 通过fontforge_python_init(psMat)完成初始化因此脚本中可以import psMat单独使用。PostScript 矩阵是 PostScript/PDF 与字体文件如 Type1、CFF中通用的 2D 仿射变换描述方式。psMat 的所有函数都返回一个6 元素浮点元组(a, b, c, d, e, f)其几何含义为x a·x c·y e y b·x d·y f其中(a, b, c, d)构成线性变换部分(e, f)是平移量。这个约定贯穿 FontForge 的整个变换体系——fontforge模块中Glyph.transform()、Layer.transform()等方法接收的矩阵正是这种格式因此 psMat 生成的元组可以直接喂给它们使用。七个核心函数逐一详解identity()零成本拿到单位矩阵identity()返回恒等变换(1.0, 0.0, 0.0, 1.0, 0.0, 0.0)表示什么都不做。在源码中它是一个最简实现直接返回常量元组fontforge/python.cppimport psMat m psMat.identity() print(m) # (1.0, 0.0, 0.0, 1.0, 0.0, 0.0)常用于作为复合变换的起点或在需要无条件应用某个变换的代码路径中充当占位。translate(x, y)平移translate(x, y)返回(1.0, 0.0, 0.0, 1.0, x, y)。源码中参数解析格外灵活既支持两个独立参数也支持一个二元组fontforge/python.cpppsMat.translate(100, 50) # 两个独立参数 psMat.translate((100, 50)) # 等价一个 (x, y) 元组注意y是可选的d|d格式串缺省为 0因此psMat.translate(100)等价于psMat.translate(100, 0)。scale(x[, y])缩放scale(x, y)返回(x, 0.0, 0.0, y, 0.0, 0.0)。y省略时按x等比缩放源码中以哨兵值-99999判断 y 是否被传入见 fontforge/python.cpppsMat.scale(2) # (2.0, 0.0, 0.0, 2.0, 0.0, 0.0) —— 整体放大 2 倍 psMat.scale(2, 3) # (2.0, 0.0, 0.0, 3.0, 0.0, 0.0) —— 水平 2 倍、垂直 3 倍由于y独立可选用它可以制造不等比拉伸——例如把正圆轮廓压成椭圆这在制作斜体或变形字体时很常用。rotate(theta)旋转rotate(theta)返回(c, s, -s, c, 0.0, 0.0)其中c cos(theta)、s sin(theta)源码实现见 fontforge/python.cpp。theta 以弧度为单位这一点与 Python 标准库math的三角函数保持一致import psMat, math psMat.rotate(math.radians(30)) # 顺时针旋转 30°注意 PostScript 坐标系中正角度的方向约定 psMat.rotate(math.pi / 2) # 旋转 90°skew(theta)倾斜生成斜体skew(theta)返回(1.0, 0.0, tan(theta), 1.0, 0.0, 0.0)即把水平方向剪切tan(theta)源码见 fontforge/python.cpp。它的文档注释明确指出用途是制作斜体字oblique font——真正的 italic 通常需要重新设计字形而 oblique 只是把直立字形整体倾斜psMat.skew(math.radians(12)) # 经典斜体倾角同样地theta必须以弧度给出tan在接近 ±90° 时趋于无穷实际使用中应避免极端角度。compose(mat1, mat2)复合两个变换compose(mat1, mat2)返回两个矩阵相乘的结果。源码内部调用MatMultiply声明于 fontforge/psread.h执行 PostScript 矩阵乘法fontforge/python.cppm psMat.compose(psMat.translate(100, 0), psMat.rotate(math.radians(45)))复合顺序决定最终效果compose(A, B)意味着先应用 A再应用 B矩阵乘法不满足交换律。实际使用时要格外注意# 先旋转后平移 ≠ 先平移后旋转 m1 psMat.compose(psMat.rotate(r), psMat.translate(x, y)) m2 psMat.compose(psMat.translate(x, y), psMat.rotate(r))inverse(mat)求逆变换inverse(mat)返回输入变换的逆矩阵内部调用MatInverse声明于 fontforge/psread.h实现见 fontforge/python.cpp。原文档特别提示逆矩阵并非总是存在——当变换退化例如用scale(0)或scale(0, 1)把某一维度压扁为零时行列式为 0无法求逆。m psMat.compose(psMat.translate(10, 20), psMat.rotate(math.radians(30))) inv psMat.inverse(m) # 取消上述变换 assert psMat.compose(m, inv) psMat.identity() # 数学上应还原为单位矩阵实战把 psMat 与 fontforge 模块组合起来psMat 的价值在于和fontforge模块的变换 API 协同。在 tests/test1003.py 中可以看到真实用法——用psMat.scale(25)放大fontforge.unitShape()生成的基础几何形状再交给stroke()做描边测试import fontforge, psMat, math convex fontforge.unitShape(7).transform(psMat.scale(25)) shapes { triangle: fontforge.unitShape(3).transform(psMat.scale(25)), square: fontforge.unitShape(4).transform(psMat.scale(25)), pentagon: fontforge.unitShape(5).transform(psMat.scale(25)), }更典型的批处理场景是把整份字体的字形做统一变形——例如把一份正体字体批处理生成倾斜版本import fontforge, psMat, math font fontforge.open(Regular.sfd) oblique psMat.skew(math.radians(12)) # 斜体倾斜变换 font.selection.all() font.transform(oblique) # 对全部选中字形应用变换 font.fontname RegularOblique font.generate(RegularOblique.ttf)由于font.transform()与 psMat 共享同一 6 元组矩阵约定生成与传入天然无缝。若希望对不同选区施加不同变换如只倾斜大写字母只需切换selection后多次调用transform即可。安装与运行环境psMat随 FontForge 的 Python 模块一起分发无需单独安装。两种常见获取方式详见 doc/sphinx/scripting/python.rstpip 安装pip install fontforge预编译 wheel 覆盖 Linuxx86_64/aarch64、macOSx86_64/arm64与 Windowsx86_64内含 FreeType、libxml2 等全部原生依赖系统包 / 源码构建通过系统包管理器安装或源码构建时开启-DENABLE_PYTHON_EXTENSIONON模块会安装到系统 Python 的 site-packages。之后即可在任意脚本中import fontforge import psMat使用要点速查函数参数返回矩阵 (a, b, c, d, e, f)要点identity()无(1, 0, 0, 1, 0, 0)恒等变换复合起点translate(x, y)数值y 可省(1, 0, 0, 1, x, y)也接受(x, y)元组scale(x[, y])数值y 可省(x, 0, 0, y, 0, 0)y 缺省时等比缩放rotate(theta)弧度(cosθ, sinθ, -sinθ, cosθ, 0, 0)角度务必用math.radians换算skew(theta)弧度(1, 0, tanθ, 1, 0, 0)用于制作 oblique 斜体compose(m1, m2)两个矩阵矩阵乘法结果顺序敏感先 m1 后 m2inverse(m)一个矩阵逆矩阵退化矩阵无逆需自行规避核心注意事项总结为四点① 所有函数返回 6 元素浮点元组可直接传给fontforge模块的transform()系列方法②rotate/skew的角度单位是弧度而非度③compose的先后顺序决定变换效果复合变换链要按先应用在后的原则书写④inverse对行列式为零的退化变换如某方向缩放到 0无效调用前应对输入做合理性检查。掌握这七个函数即可在 FontForge 的 Python 批处理脚本中自由组合平移、缩放、旋转与倾斜完成从字体斜体化到字形变形的各类自动化任务。赞分享桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载相关推荐FontForge Python 脚本编程指南fontforge 与 psMat 模块、命令行用法与 pip 扩展安装FontForge Python 脚本编程指南fontforge 与 psMat 模块、命令行用法与 pip 扩展安装 FontForge 在自身 C 引擎之桌面应用图形学Django REST Pandas企业级应用构建可扩展的数据分析平台Django REST Pandas企业级应用构建可扩展的数据分析平台 Django REST Pandas是一个强大的开源工具它能够通过Django REOntop Docker部署完全教程快速搭建SPARQL端点服务Ontop Docker部署完全教程快速搭建SPARQL端点服务 Ontop是一个强大的平台能够将关系数据库作为虚拟RDF知识图谱进行查询通过SPARQL上一篇泛型参数 vs dyn TraitRust 静态分发与动态分发的取舍之道下一篇Nacos 鉴权插件规范服务端与客户端 SPI 架构、配置选择与安全实践创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表