ba21 发表于 2023-11-12 20:39:52

Unifont字体原理解析

本帖最后由 ba21 于 2023-11-14 10:31 编辑

前段时间在更新本人“郴维电脑装机维护工具”(U盘启动制作工具)时,用上了之前写的“Grldr内置菜单编辑器”,但是缺少了Windows系统字体转Unifont字体的功能,看别人程序都有这个功能,于是秉着自己能搞得出的东西就自己搞,没必要用别人的(并不是用得上,单纯就是好奇想做出来)。
Unifont字体是以.hex扩展名文本形式保存,相关的资料少的可怜,经过一段时间的摸索,终于搞清了它的原理。

什么是Unifont字体,Unifont字体的应用场景,这里就不多说了,可自行ChatGPT。
使用Unifont字体的案例,接触最多的应该就是U盘启动制作工具,市面上的U盘启动制作工具基本上都是使用GRUB4DOS制作,而GRUB4DOS使用的就是Unifont字体。

主要优点:
字符覆盖范围广泛。
低分辨率下能够保证文字清晰。

主要缺点:
小字号下的显示效果很差,且官网目前只有 16px * 16px 的字体,未来可能会出 32px * 32px 的字体。
官网字体单一,特殊字体或大号字体需要自行制作。

Unifont字体原理:
在官网http://unifoundry.com/pub/unifont/ 下载字体文件 如:unifont-15.1.02.hex.gz,解压后得到unifont-15.1.02.hex(它是一个纯文本文件),然后用notepad++打开,如图:

每行由2个字段使用“:”分割从而组成一个字符信息
<Unicode 码点>:<字形数据>
第1个字段为4位到6位的代码点(字符的十六进制表示形式),
第2个字段为“字形数据”(字符的位图表示形式),用十六进制数字表示。
    对于 16px * 16px 大小的字符,字形数据由32个十六进制数字组成,ASCII范围内的字符为 8px * 16px,原因是ASCII用宽度一半的像素就够表示了(宽 = 16/2 px),所以ASCII码可以由16个或者32个十六进制数字组成。

字符信息分析 如:
0078:00000000000042422418182442420000

第1个字段代码点:
    0078 通过查找ASCII码表得到对应字符为“x”。

第2个字段字形数据:
    字形数据:就是由0和1组成的像素点数据,0表示背景,1表示字形,然后把这些二进制数据合成十六进制的字符串形式。
    00000000000042422418182442420000
    00 00 00 00 00 00 42 42 24 18 18 24 42 42 00 00对于 16px * 16px 大小的字符,ASCII范围内的字符可以是16/2px * 16px。
    转为二进制,1个字节为8个二进制位,8个像素用1个字节可以表示,16个像素则要用2个字节来表示,以此类推。
    00 00000000
    00 00000000
    00 00000000
    00 00000000
    00 00000000
    00 00000000
    42 01000010
    42 01000010
    24 00100100
    18 00011000
    18 00011000
    24 00100100
    42 01000010
    42 01000010
    00 00000000
    00 00000000

附上本人用C#写的“Windows系统字体转Unifont字体”和“Grldr内置菜单编辑器”程序给有需要的人,及转换后的效果图:
WinXp、Win7(Win8及更高版本无需安装,已自带)使用前请先安装 .net framework 4 或以上 运行库,否则程序无法运行。








歌者文明清理员 发表于 2023-11-12 22:06:57

nb

ba21 发表于 2023-11-12 22:37:46

歌者文明清理员 发表于 2023-11-12 22:06
nb

过奖。。。

liuhongrun2022 发表于 2023-11-13 20:53:27

nb
页: [1]
查看完整版本: Unifont字体原理解析