适用于小屏幕的 5x5 像素字体
文章摘要
Maurycy 在博客里发布了他手工设计的一款 5×5 像素的微型位图字体——mcufont。所有字符都装进 5 像素见方的格子,并能安全绘制在 6×6 的网格上(含字符间距)。它的设计灵感来自 lcamtuf 的 font-inline.h(5×6),后者又脱胎于 ZX Spectrum 的 8×8 字体。作者认为 5×5 是”不牺牲可读性”的最小尺寸:2×2 完全不可能;3×3 技术上能做但不可读;4×4 不足以画出真正的”E、M、W”;只有到 5×5,才刚好能让大多数小写字母比大写小一格,从而保留视觉上的大小写区分。
虽然有些字符其实只需要 3 或 4 列宽,但作者刻意保持等宽设计——这极大简化了渲染和排版:字符串在屏幕上的长度永远等于字符数 × 6 像素,再也不必担心”8978 比 1111 更长导致溢出”。整套字体只占 350 字节,非常适合 8 位单片机比如 AVR128DA28(仅 16KB RAM)。这类 MCU 便宜、低功耗、可靠,但显存吃紧——一块 384×288 屏就有 11 万像素,远超其内存。所以现实中更常用 160×128 或 128×64 的 OLED,而这种屏迫切需要专为像素绘制的高效字体。
文章后半部分作者还演示了把字体压缩到极限的情形:3×5(牺牲部分字符)、3×4(无法区分大小写)、3×3、2×3、3×2,乃至 2×2——后者已不再像字体而像”密码”。在真实硬件上,由于像素并非完美方块,字体反而会因为子像素结构产生类似”伪阴影”的柔化效果,让”e”和”g”等字符出乎意料地清晰。文末附上了源码(mcufont.h)以及参考链接。
HN 评论精华
-
FelipeCortez 抛出一个反直觉案例:1×5 字体也是可行的,前提是利用 LCD 子像素渲染。链接到 msarnoff 的”millitext”项目,把每个像素的 R/G/B 通道作为独立的”亚像素”使用。
-
ludocode 指出 5×5 和 3×5 都不能覆盖完整的 ASCII,并且”加上间距其实需要 6×6 或 4×6 网格”。他推荐 Spleen 字体的 5×8 版本,并自己改造为”4×8 字符 + 5×9 网格”以保证字间距,这种保守做法对实际显示更稳定。
-
archargelod 分享了实践经验:大多数极小字体在 1:1 显示时其实糟糕得难以辨认。他在做一个游戏 mod 时尝试过各种 3×3、3×5、2×5 字体后都失败了,最后选用 fontstruct 上 zephram 的 “Gremlin-3x6” 字体,紧凑但可读性好。可惜该作者已删号,他自留了一份 CC0 副本。
-
gurkwart 反驳作者关于”3×4 不能区分大小写”的说法——他设计的 MiniGent 字体(3×4)就做出了希腊字母、数字、标点、数学符号、货币和 emoji,并基于它开发了一套 LaTeX 排字系统 pixeltex。
-
patrakov 从另一个角度切入:使用多级灰度(不仅仅是开/关)在更小尺寸下也能让”文本”——而非单字——可读,因为人脑会从上下文推断模糊的字母。他的演示能在 240 像素宽度内放下 80 字符,平均每字符仅占 3 个水平像素(含间距)。
-
kibwen 是技术细节党:他逐项反驳尺寸论断——5×5 其实不够画出真正的小写”e”如果要让小写比大写矮;要带正确的下伸部(descender)需要 7 高;为了让 “g/y” 与基线分离应该 8 高;考虑字符间距实际上每字符要 8×6 像素。换言之,”5×5 不妥协”是相对论。
-
bmurray7jhu 还指引到 Stack Exchange 上一个关于”CJK 文字最低像素”的有趣讨论,提示中文这种笔画密集的字符在小尺寸下挑战远大于拉丁字母。