petipoua/petiglyph

GitHub: petipoua/petiglyph

将图片和视频转换为自定义字体字形的 TUI/CLI 工具,支持静态与动画字形、精灵图网格拆分,生成标准 TTF 和 BDF 字体文件。

Stars: 95 | Forks: 7

# petiglyph `petiglyph` 是一个 TUI 和 CLI 工具,用于将图像和视频转换为自定义字体字形(glyphs)。 已在内部实现终端中的“太空狼跳电臀舞(twerking amogus)” 😎 TUI 中的太空狼 ### 视频教程: [![演示视频](https://raw.githubusercontent.com/petipoua/petiglyph/main/readme-assets/petiglyph-demo.gif)](https://raw.githubusercontent.com/petipoua/petiglyph/main/readme-assets/petiglyph-demo.mp4) ## 快速入门 ### 1. 安装 选择其中一种方式: ``` npm install -g petiglyph ``` ``` pip install petiglyph ``` ``` yay -S petiglyph ``` 你也可以从 GitHub Releases 下载预编译的二进制文件。 请确保 `ffmpeg` 已添加到 `PATH` 中。 ### 2. 用法 在终端中,进入你希望创建项目的文件夹,然后输入: ``` petiglyph ``` 这会打开 TUI 主面板,你可以在其中创建项目并开始导入媒体,以生成字形、网格和动画。 支持的媒体: - 图像:`png`、`jpg`、`jpeg`、`webp`、`bmp`、`gif`、`svg`、`avif` - 动画媒体:`gif`、`mp4`、`mov`、`mkv`、`webm`、`avi`、`m4v` 生成的字形可以是 4 种类型: - 标准等宽,静态 - 标准等宽,动画 - 字形网格,静态 - 字形网格,动画 对于所有这 4 种类型,petiglyph 将在安装字体后,在主面板的 `Installed petiglyph fonts`(已安装的 petiglyph 字体)区域生成静态和动画字形。 要复制这些字形以便在其他地方复用,你需要使用方向键导航到 `Installed petiglyph fonts` 区域,选择你想要的字形,按 ENTER 键将其复制到剪贴板,然后粘贴到你自己的工具或应用中(这些应用也需要加载新字体,请参阅上面的警告)。 在动画字形上按 ENTER 键会将所有帧复制到剪贴板。要看到它们的动画效果,你需要编写自己的脚本来将所有字形渲染为动画。
## 文档 ### 项目模型与发现 每个项目都是自包含的: ``` my-font/ petiglyph.toml images/ build/ petiglyph.lock ``` `petiglyph.toml` 存储配置,`images/` 存储项目本地源和 导入的帧,`build/` 存储生成的产物,以及 `petiglyph.lock` 在首次构建后保留字形到码点(codepoint)的分配关系。 使用以下命令创建项目: ``` petiglyph new-project my-font ``` 如果没有子命令,`petiglyph` 将打开工作区 TUI。项目发现 会搜索当前目录及深度为 2 的后代目录,并且 不跟随目录符号链接。如果只发现一个项目,则会自动选中。 如果发现多个项目,则会在交互式终端中打开工作区选择器; 而自动化命令则会报告其歧义。`use-project` 通过精确的 项目目录基本名称(basename)进行选择,并拒绝具有重复匹配项的候选路径。 ### CLI 参考 | 命令 | 用途及重要选项 | | --- | --- | | `petiglyph` 或 `petiglyph tui` | 打开工作区 TUI。需要交互式终端。 | | `petiglyph new-project ` | 创建 `/petiglyph.toml`、`images/` 和 `build/`。 | | `petiglyph use-project tui` | 在 TUI 中打开选定的一个项目。 | | `petiglyph use-project create glyph ...` | 导入一个或多个静态字形源。 | | `petiglyph use-project create grid-glyph ...` | 导入一个被拆分为 `--rows` 行和 `--cols` 列的源。 | | `petiglyph use-project create animated-glyph ...` | 将 GIF/视频帧作为字形导入;需要 `--fps`。 | | `petiglyph use-project create animated-grid-glyph ...` | 导入拆分为网格的帧;需要 `--fps`、`--rows` 和 `--cols`。 | | `petiglyph use-project configure glyph ...` | 设置或清除源阈值并设置反转。 | | `petiglyph use-project configure grid-glyph ...` | 配置网格尺寸、渗透、阈值和反转。 | | `petiglyph use-project configure animation ...` | 配置 FPS、阈值、反转和仅网格设置。 | | `petiglyph use-project delete animation ` | 移除一个动画定义。 | | `petiglyph use-project build` | 生成项目产物。`--force-remap` 会丢弃先前的码点分配。 | | `petiglyph use-project install-font` | 构建并安装所选项目的托管字体。 | | `petiglyph use-project show-sample` | 打印现有的 `build/glyph-sample.txt`;它不会执行构建。 | | `petiglyph use-project doctor` | 运行全局和所选项目检查;`--repair` 应用支持的修复。 | | `petiglyph list projects` | 列出已发现的项目和清单格式错误的警告。 | | `petiglyph list installed-fonts` | 列出已管理的已安装字体系列及其所有权详细信息。 | | `petiglyph delete-project ...` | 验证整个批次,然后删除项目目录。 | | `petiglyph uninstall-font ...` | 从 `list installed-fonts` 中卸载确切的托管字体系列名称。 | | `petiglyph uninstall-all-fonts` | 移除所有托管 Petiglyph 字体和元数据。 | | `petiglyph doctor` | 运行全局检查和任何可解决的项目检查。 | 全局 `--debug` 启用项目本地的管线诊断。 `--ffmpeg-auto-install` 允许在 缺少 FFmpeg 时运行检测到的包管理器命令。支持自动化的命令接受 `--json`;创建操作也 接受 `--build` 和 `--install`,其中 `--install` 隐含了构建。使用 `petiglyph --help` 获取详尽的标志语法和接受的值。 ### 创建和配置字形 CLI 公开了与 TUI 相同的四种创建类型: ``` # 每个 glyph 一张图片 petiglyph use-project my-font create glyph \ --input logo.png mark.svg # 一个 Sprite Sheet 拆分为 glyph 单元格 petiglyph use-project my-font create grid-glyph \ --input icons.png --rows 4 --cols 4 # GIF/视频帧作为 glyph petiglyph use-project my-font create animated-glyph \ --input spinner.gif --name spinner --fps 8 # 每帧拆分为网格单元格 petiglyph use-project my-font create animated-grid-glyph \ --input dashboard.mp4 --name dashboard --fps 10 \ --rows 2 --cols 4 ``` 一个 `--input` 可接受多个路径。创建操作会导入和配置源, 除非有请求,否则不会进行构建或安装。静态构建输入为 `png`、 `jpg`、`jpeg`、`webp`、`bmp`、`gif` 和 `svg`。`avif` 仅支持导入,并 转换为项目本地的 PNG。动画媒体支持 `gif`、`mp4`、`mov`、 `mkv`、`webm`、`avi` 和 `m4v`。 ``` petiglyph use-project my-font configure glyph logo.png \ --threshold 88 --invert on petiglyph use-project my-font configure glyph logo.png \ --clear-threshold petiglyph use-project my-font configure grid-glyph icons.png \ --rows 2 --cols 8 --horizontal-bleed strong --vertical-bleed off petiglyph use-project my-font configure animation spinner \ --fps 12 --threshold 72 --invert off petiglyph use-project my-font delete animation spinner ``` 网格尺寸和渗透仅对网格源和网格动画有效。 ### 调优参数 图像管线执行可选的灰度导入处理、纵横比适应 缩放、阈值处理、可选反转,然后是可选的网格边缘渗透。 所有预览都通过统一的缩放比例保持源或字形的纵横比; 空白的垂直行可能会在适应之前被裁剪,但预览永远不会 被拉伸以填满多余的宽度或高度。 | 设置 | 范围/默认值 | 效果 | | --- | --- | --- | | `threshold` | `0..=255`,默认为 `64` | 较高的值保留较少的像素;较低的值产生更饱满的形状。可以按源覆盖项目默认值。 | | `invert` | `on` 或 `off`,默认为 `off` | 翻转阈值处理的结果。 | | `grayscale_enabled` | 静态默认关闭;动画默认开启 | 通过灰度色调处理重写导入的光栅像素。SVG 文件不会被重写。 | | `grayscale_brightness` | `-80..=80`,默认为 `0` | 增亮或变暗灰度值。 | | `grayscale_contrast` | `-80..=80`,默认为 `0` | 增加或减少色调分离度。 | | `grayscale_gamma_percent` | `50..=200`,默认为 `100` | 调整中间调;处理顺序依次为伽马、对比度、亮度,然后是阈值。 | | `rows`、`cols` | 两者均大于 `0` | 将完整源适应为网格,然后将其拆分为字形单元格。 | | `horizontal_bleed` | `off`、`weak`、`strong`;默认为 `weak` | 略微扩展跨越内部左/右网格边界的轮廓,以减少接缝。 | | `vertical_bleed` | `off`、`weak`、`strong`;默认为 `off` | 扩展跨越内部上/下边界的轮廓;支持情况取决于渲染器。 | | `fps` | `1..=30` | 存储 Petiglyph 预览/播放时序元数据。TTF 文件包含静态字形且本身不会动画。 | | `glyph_size` | 默认为 `64` | 设置在生成字体轮廓之前使用的光栅工作大小。 | `off` 保持网格边缘裁剪状态,`weak` 增加少量重叠,`strong` 增加 更大的重叠。渗透改变的是最终的轮廓几何形状,而不是阈值处理。 ### 清单参考 正常的读取和构建可能会重写 `petiglyph.toml` 以创建或规范化 托管字段,因此请保持其可写权限。 | 字段 | 类型和默认值 | 含义 | | --- | --- | --- | | `input_dir` | 字符串,`"images"` | 项目相对源目录。 | | `out_dir` | 字符串,`"build"` | 项目相对构建目录。 | | `font_name` | 字符串,`"Petiglyph"` | 生成的字体系列名称。 | | `glyph_size` | 整数,`64` | 光栅工作大小。 | | `threshold` | 整数,`64` | 项目全局阈值。 | | `codepoint_start` | 码点字符串,`"U+100000"` | 项目补充专用区域的首选起始位置。 | | `project_id` | 托管字符串 | 稳定的项目标识。缺失或为空值时将自动生成。 | | `threshold_overrides` | 表,空 | 以相对于 `input_dir` 的路径为键的按源阈值。 | | `invert_overrides` | 表,空 | 以相对于 `input_dir` 的路径为键的按源布尔值。 | | `compositions` | 表,空 | 以源路径为键的静态网格定义。 | | `animations` | 表数组,空 | 标准或网格动画定义。 | 网格组合包含 `rows`、`cols`、`horizontal_bleed` 和 `vertical_bleed`。省略的渗透值将默认规范为水平 `weak` 和 垂直 `off`。 ``` [compositions."icons.png"] rows = 4 cols = 4 horizontal_bleed = "weak" vertical_bleed = "off" [[animations]] name = "spinner" type = "standard" fps = 8 frames = ["spinner-0001.png", "spinner-0002.png"] [[animations]] name = "dashboard" type = "grid" fps = 10 frames = ["dashboard-0001.png", "dashboard-0002.png"] rows = 2 cols = 4 horizontal_bleed = "weak" vertical_bleed = "off" ``` 动画帧路径是相对源键。标准动画不能 定义网格字段。网格动画需要为正数的 `rows` 和 `cols`。 动画条目还可包含 `grayscale_processing`,它记录了 `grayscale_enabled` 以及一个嵌套的 `grayscale` 表(包含 `gamma_percent`、 `contrast` 和 `brightness`)。色调值在读取时会规范化为其支持的 范围。 ### 构建和码点稳定性 ``` petiglyph use-project my-font build petiglyph use-project my-font build --force-remap ``` | 产物 | 位置和用途 | | --- | --- | | TTF | `build/.ttf`:用于应用程序和托管安装的标准字体。 | | BDF | `build/.bdf`:位图字体表示。 | | 映射 | `build/glyph-map.json`:源/字形名称和分配的 Unicode 码点。 | | 样本 | `build/glyph-sample.txt`:使用已分配码点的可复制文本。 | | 预览 | `build/previews/*.png`:每个生成的字形的阈值预览图像。 | | 字形锁 | `petiglyph.lock`:供未来构建使用的项目根分配历史记录。 | 现有的源映射通过 `petiglyph.lock` 保持稳定。已移除的 映射可能保持非活动状态,因此它们的码点不会被意外重用。 Petiglyph 为托管项目保留了非重叠的补充专用区域。 如果其拥有的范围必须增长且现有分配无法保留,正常的构建 可以自动重新定位和重新映射项目。 `--force-remap` 会有意丢弃现有分配并分配一个全新的映射。使用旧码点存储的文本可能会渲染出错误的字形 或根本不渲染任何字形。 生成的 TTF 可以像任何标准 字体一样嵌入到其他应用程序中。嵌入 Petiglyph 可执行文件本身也需要在每个用户的系统上提供 FFmpeg。 ### 安装和卸载 ``` petiglyph use-project my-font install-font petiglyph list installed-fonts petiglyph uninstall-font "my-font Petiglyph" petiglyph uninstall-all-fonts ``` 安装是显式的、托管的,并由项目元数据拥有。重新安装 项目会替换该项目先前的托管产物。在平台支持的 情况下,Petiglyph 会刷新或广播字体缓存状态。 托管位置: | 平台 | 位置 | | --- | --- | | Linux | `~/.local/share/fonts/petiglyph/` | | macOS | TTFs 位于 `~/Library/Fonts/`;元数据位于 `~/Library/Fonts/petiglyph/` | | Windows | `%LOCALAPPDATA%/Microsoft/Windows/Fonts/petiglyph/` | 使用 `list installed-fonts` 获取 `uninstall-font` 接受的确切字体系列名称。 卸载命令通过 Petiglyph 元数据选择托管产物, 并且不会移除不相关的字体。更改 字体后请重启应用程序,以便它们重新加载字体状态;完全重启系统仅作为最后手段。 在 Windows Terminal 1.21 或更高版本中,在主要的 终端字体之后添加已安装的系列作为回退字体,例如 `"Cascadia Mono, my-font Petiglyph"`。 ### 诊断和恢复 `petiglyph doctor` 始终检查全局托管安装和 Unicode 注册表 状态。当一个或多个清单可以被解析时,它也会 运行项目检查。 `petiglyph use-project my-font doctor` 显式地选择一个项目。 | 结果 | 含义 | | --- | --- | | `info` | 一次成功的检查或信息状态。 | | `warning` | 可恢复的不一致性或缺失的预期状态。 | | `error` | 可能阻碍正确操作的无效状态。 | | `repaired` 状态 | 报告的问题在此运行期间已成功更改。 | 检查涵盖过期的全局和项目锁、格式错误的安装元数据、 孤立的元数据和托管 TTF、Unicode 注册表结构和范围 冲突、清单有效性、源可见性以及字形锁标识、 条目、码点和源引用。 ``` petiglyph doctor --repair petiglyph use-project my-font doctor --repair ``` `--repair` 仅执行支持的修复,例如移除过期的锁和 孤立项、移除无效的字形锁条目或重新创建缺失的项目 范围分配。它不会重新构建或重新安装项目。 ### JSON 自动化 将 `--json` 添加到支持的命令中: ``` petiglyph list projects --json petiglyph use-project my-font create glyph \ --input logo.svg --build --json petiglyph use-project my-font doctor --json ``` 成功和失败的命令使用一个信封: ``` { "ok": false, "command": "use-project.create.glyph", "version": "0.1.5", "data": { "completed_stages": ["resolve", "import", "configure"] }, "error": { "code": "creation_stage_failed", "stage": "build", "message": "build failed", "causes": [], "hints": [ "Imported files and manifest changes were retained.", "Fix the reported cause, then run the project build or install command." ] } } ``` | 字段 | 含义 | | --- | --- | | `ok` | 成功时为 `true`,否则为 `false`。 | | `command` | 稳定的命令标识符。 | | `version` | 生成响应的 Petiglyph 版本。 | | `data` | 特定命令的负载;失败的创建操作包括已完成的阶段。 | | `error` | 成功时为 `null`,否则为结构化失败信息。 | | `error.code` | 机器可读的失败类别。 | | `error.stage` | 适用时标记失败的创建阶段。 | | `error.message` | 主要面向用户的错误。 | | `error.causes` | 嵌套的错误链消息。 | | `error.hints` | 恢复指导。 | | `error.candidates` | 提供时的候选匹配项;为空时省略。 | 失败会返回非零的退出代码。多阶段创建失败可以保留 已完成的导入和清单更改;请检查 `data.completed_stages`,修复 报告的原因,然后再次运行构建或安装。 ### 运行时、调试和故障排除 FFmpeg 会在命令分发之前(包括 TUI 启动时)被检查。请将其安装到 `PATH` 中,传递 `--ffmpeg-auto-install`,或设置 `PETIGLYPH_NO_FFMPEG_PROMPT=1` 以抑制交互式安装提示。 `--debug` 或设置为真值的 `PETIGLYPH_DEBUG` 会在所选项目目录的 `debug/pipeline.log` 和 `debug/artifacts/` 中启用图像管线诊断。 `PETIGLYPH_DEBUG_CELL=x` 会覆盖调试预览渲染所使用的 终端单元格几何形状。 设置 `PETIGLYPH_TUI_DEBUG=1` 以启用 TUI 事件日志。默认情况下,日志使用平台 临时目录;`PETIGLYPH_TUI_DEBUG_LOG=/path/to/log` 可覆盖 该路径。 | 问题 | 操作 | | --- | --- | | 缺少 FFmpeg | 将 FFmpeg 安装在 `PATH` 中或使用 `--ffmpeg-auto-install`,然后重新运行 Petiglyph。 | | 未找到项目 | 从包含深度 2 以内项目的目录运行,或使用 `new-project` 创建一个。 | | 项目选择不明确 | 在该基本名称唯一的工作区中使用 `use-project `。 | | 清单格式错误 | 修复报告的 TOML 字段或值;`list projects` 会报告格式错误的清单,而不将其视为有效项目。 | | 不支持该媒体 | 将其转换为支持的静态或动画格式;AVIF 必须通过导入工作流输入。 | | TUI 在终端外失败 | 在交互式终端中运行它,或者在自动化中使用带有 `--json` 的 CLI 命令。 | | 码点或注册表冲突 | 运行 `doctor`;对于支持的修复使用 `--repair`。仅在可以接受更改旧映射时才使用构建 `--force-remap`。 | | 过期的锁阻碍了工作 | 运行 `doctor --repair`;过期的锁会在十分钟后被识别。 | | 已安装的字形无法渲染 | 使用 `list installed-fonts` 确认确切的系列,在应用程序中对其进行配置,然后完全重启该应用程序。 | | 剪贴板复制失败 | 安装一个可用的提供程序:Linux/Unix 上的 `wl-copy` 或 `xclip`,macOS 上的 `pbcopy`,或 Windows 上的 PowerShell/`clip.exe`。 | ### 开发链接 - [CI.md](CI.md) - [RELEASE.md](RELEASE.md) - [CONTRIBUTING.md](CONTRIBUTING.md)
标签:ffmpeg, GIF处理, GNU通用公共许可证, MITM代理, Node.js, Python, Python安全, SVG处理, TUI工具, 二进制发布, 像素艺术, 像素转换, 可视化界面, 图像处理, 多媒体处理, 威胁情报, 字体生成器, 字符画, 开发者工具, 开源工具, 控制台应用, 无后门, 终端动画, 终端艺术, 自定义字体, 视频处理, 视频转字符画, 逆向工具, 通知系统