FontForge fontimage 工具指南:一键生成字体缩略图
桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载导读fontimage是 FontForge 附带的命令行小工具用于把任意格式的字体文件渲染成一张缩略图方便快速预览字体的视觉效果。它既可以显式指定要显示的文本也可以自动探测字体包含的文字脚本如拉丁文、希腊文、西里尔文、阿拉伯文、汉字等并挑选合适的样例文字。本文以 fontimage.rst 为骨架结合仓库源码fontimage.pe、sflayout.cpp、scripting.rst深入讲解其用法、参数细节与底层实现。一、fontimage 是什么fontimage从命令行加载一个字体文件FontForge 能读的任意格式均可包括.sfd、.ttf、.otf、.pfb、.woff等然后生成一张包含该字体代表性字形的图片。正如 fontimage.1 手册页所述produces an image showing representative glyphs of the font它本质上是一个包装脚本仓库中的 fontimage.pe 是一个 FontForge 原生脚本.pe即 PostScript 风格脚本其核心调用是FontImage(outfile, lines, width, height)对应底层 C 函数FontImage()定义于 sflayout.cpp。由于它走的是 FontForge 的完整加载与排版链路因此无论是矢量轮廓字体还是位图字体只要能通过Open()打开就能生成缩略图。二、命令语法与参数详解原文档给出的完整语法为fontimage [--o outfile] [--width num] [--height num] [--pixelsize num] [--fontname] [--text string] [--version] [--help] fontfile下面逐一说明各参数同步参考 fontimage.pe 中的实际解析逻辑。2.1 字体文件fontfile必填参数。如果缺失脚本会直接报错退出if ( !foundfont ) Error( You must specify a font. ) endif脚本在解析参数时遇到不以-开头的参数即视为字体文件并通过Open($1, 1)加载。若传入多个字体文件只会使用最后一个并给出警告源码见 fontimage.pe。2.2--o outfile输出文件指定输出图片文件名。图片格式由扩展名决定目前仅支持.bmp与.pngPNG 需要 FontForge 编译时带 libpng 支持若编译时禁用 PNG 则仅支持 BMP见 sflayout.cpp 中#ifndef _NO_LIBPNG分支。若省略fontimage 会基于字体的 fontname 自动生成输出文件名if ( outfile ) outfile $fontname .png endif注意脚本中字体名可能包含空格等特殊字符因此建议始终显式指定-o。2.3--width num/--height num画布尺寸--width num输出图片宽度像素。省略时图片宽度自动适应文本长度。--height num输出图片高度像素。省略时高度自动适应所有文本行。在底层实现中省略时width/height传-1FontImage() 会按文本实际排版尺寸自动计算if ( width-1 ) width li-xmax2; if ( height-1 li-lcnt!0 ) height li-lineheights[li-lcnt-1].y li-lineheights[li-lcnt-1].fh 2 ybase;2.4--pixelsize num文字像素尺寸指定后续文本的显示字号像素。该参数可多次出现每次作用于其后出现的所有--text行“后出现覆盖前设定”的流式语义。脚本解析中pixelsize默认值为 24见 fontimage.pe每次遇到--pixelsize即更新当前值并在生成行时把[pixelsize, 文本]成对压入lines数组if ( temp-pixelsize $argc2 ) shift pixelsize Strtol($1)2.5--text string指定显示文本指定一行要显示的文本。字符串必须是 UTF-8 编码。可多次出现以生成多行文本。若完全省略fontimage 会扫描字体中它认识的文字脚本为每种脚本挑选一段代表性文本详见下文“自动脚本探测”。脚本把[当前 pixelsize, 文本]追加进lineselseif ( temp-text $argc2 ) shift lines lines [ pixelsize, $1 ]2.6--fontname附加字体名行在图片中额外加入一行字体名。脚本中它等价于向lines追加一个[pixelsize, 0]的“占位”条目后续再统一替换为字体名elseif ( temp-fontname ) lines lines [ pixelsize, 0 ]参数解析结束后所有值为 0 的整数条目会被替换为字体名文本if ( TypeOf(lines[i])Integer lines[i]0 ) lines[i] $fontname ;注意--fontname生成的这一行会使用当前--pixelsize设定。2.7--version/--help--version打印版本号并立即退出脚本中写死Print( Version 1.0 )。--help打印参数列表与说明后退出。若脚本遇到无法识别的参数也会打印同样的用法说明并返回源码见 fontimage.pe。三、典型使用示例示例 1最小用法——自动探测脚本fontimage /path/to/font.ttf此时不指定任何文本fontimage 自动分析字体包含的脚本生成fontname.png。示例 2指定文本与多行fontimage --o preview.png --text Hello, 世界 --pixelsize 48 --fontname MyFont.sfd一行Hello, 世界默认 24px一行字体名48px。示例 3完全自定义多行、多字号fontimage --width 600 --height 200 \ --pixelsize 24 --text The quick brown fox \ --pixelsize 40 --text ABCDEFGHIJKLMNOPQRSTUVWXYZ \ --o sample.png font.otf这里--pixelsize 40只影响其后那行大写字母文本前面的行保持 24px。示例 4以 FontForge 脚本方式直接调用fontimage底层等价于在 FontForge 脚本中调用FontImage()函数详见 scripting.rstFontImage(FontImage.png, [17,abcd, 38,ABCD])参数为[pointsize, utf8-string]成对的数组可加可选的第 3、4 个参数指定宽高-1表示自动参见 scripting-alpha.rst。上例生成的效果即 FontImage.png上方 17px 的小写abcd下方 38px 的大写ABCD。四、底层原理从命令行到像素fontimage的完整调用链如下参数解析fontimage.pe无文本时调用SFDefaultScriptsLines()生成默认行sflayout.cppFontImage()底层调用LayoutInfoRefigureLines()进行排版换行再用LI_FDDrawChar()逐字绘制到GImage上sflayout.cpp依据扩展名调用GImageWritePng()或GImageWriteBmp()写出图片。关键点排版引擎走的是与 FontForge 主界面「字形预览」相同的LayoutInfo排版体系dpi72、wraptrue支持 OpenType 特性StdFeaturesOfScript与 RTL 文本ScriptIsRightToLeft决定行内起点 x 坐标因此阿拉伯文、希伯来文等从右往左书写的文本也能正确渲染。位图字体若字体onlybitmaps且含位图则FontImage直接按位图字形渲染sftf_bitmap类型。灰度输出生成的是 256 级灰度图base-clut-is_grey true黑字白底。五、自动脚本探测逻辑详解当不提供任何--text/--fontname时fontimage会扫描字体的全部字形按 Unicode 编码归类为脚本并为每种脚本挑选代表性文本。仓库实现见 SFDefaultScriptsLines()首行固定为字体全名sf-fullname回退到sf-fontname且字号放大为3*pixelsize/2作为标题。依次对DEFAULT_SCRIPT拉丁、latn、grek希腊、cyrl西里尔、hebr希伯来、arab阿拉伯、deva天城文、hani汉字、kana日文假名、hang韩文等脚本使用内建样例字符串。对其他脚本用ScriptMainRange()取该脚本的主 Unicode 区段最多取 50 个码点拼成样例。对每个候选样例用SFGetChar()检查字体中是否真的有对应字形若没有则跳过该脚本避免显示空白/方框缺字。若扫描完所有字形都找不到任何已知脚本则退化为“取前 50 个有 Unicode 编码的字形”作为样例例如 Phaistos Disc 这类无脚本分配的字体。最多处理 200 种脚本超出即截断。因此默认输出往往包含多行先是加大的字体名标题然后是按字体实际内容挑选出的每种脚本样例行。六、安装、输出格式与注意事项安装与包装方式在 Unix 上CMakeLists.txt 会把 fontimage.pe 包装成带 shebang 的可执行脚本#!/prefix/bin/fontforge -langff安装到${CMAKE_INSTALL_BINDIR}即bin/同时把 fontimage.1 安装到man1目录。因此安装 FontForge 后可直接在 shell 中运行fontimage。在 Windows 等非 Unix 平台.pe文件则安装到数据目录的nativescripts下。输出格式限制扩展名说明.png需要 FontForge 编译时带 libpng 支持无 libpng 时给出报错“Unsupported image format must be bmp”.bmp任何构建下均可用版本要求fontimage.pe 开头检查运行版本低于20080616的 FontForge 会直接报错要求升级因为依赖更晚加入的FontImage()脚本函数。注意事项--text必须传 UTF-8 字符串命令行下注意终端编码。输出图片是灰度图不保存颜色信息若要彩色预览请改用 FontForge GUI 或自行处理。图片尺寸省略时为“恰好容纳文本”长文本字体可能产生很大的图建议用--width/--height约束。参见fontimage.rst本文档来源fontimage.1fontimage 手册页fontimage.pefontimage 实现脚本scripting-alpha.rstFontImage()脚本函数文档FontImage.pngFontImage()输出示例图FontForge 主文档赞分享桌面应用图形学【免费下载链接】fontforgeFree (libre) font editor for Windows, Mac OS X and GNULinux项目地址https://gitcode.com/gh_mirrors/fo/fontforge点击查看免费下载相关推荐QualityScaler vs 其他AI超分工具为何选择这个开源解决方案QualityScaler vs 其他AI超分工具为何选择这个开源解决方案 QualityScaler 是一款功能强大的开源AI图像/视频超分工具它能够利用图像处理视频处理计算机视觉AI 应用本地部署FontForge从零开始开源字体设计工具全攻略FontForge从零开始开源字体设计工具全攻略 一、功能定位专业级字体编辑器的核心价值 1.1 开源字体设计工具的定位与优势 FontForge作为一款完桌面应用图形学FontForge与Python脚本自动化生成字体变体FontForge与Python脚本自动化生成字体变体 你是否还在手动调整字体粗细、间距和样式面对多语言版本的字体适配是否感到繁琐本文将带你探索如何通过F桌面应用图形学上一篇如何用智能开发助手提升AI编程效率解决代码生成质量衰退的5个关键策略下一篇Puerts WebGL 包版本演进深度解析从 Changelog 解读 JS 运行时架构与关键技术决策创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考