minigui bin字库制作

news/2024/10/25 15:27:52/

bin字库的格式,bin字库如何生成,bin字库如何解析?

  • 为何选择.bin字库?
    芯片处理性能不是很好时,为了降低cpu处理数据量,才选择使用.bin字库;矢量字库虽然美观,但解析耗时故未采用。

  • minigui 自带的bin字库格式是怎样的?
    1.font目录下有8x16-iso8859-1.bin ,song-16-gb2312.bin
    翻阅资料,其实就是把数组以二进制的形式保存写入到文件中;
    eg:
    unsigned char GBK_font[]={
    0x00,0x00,0x00,0x00,0x04,0x20,0x19,0x20,0x17,0xF0,0x19,0x70,0x11,0xA8,0x1F,0x28,
    0x1F,0xC8,0x1F,0xF8,0x15,0xC8,0x0A,0xC8,0x0F,0xC8,0x0A,0xF8,0x12,0x00,0x13,0xF0,/* “?”, 7614*/};

fwrite(GBK_font, sizeof(GBK_font), 1, fd);

生成的文件就是.bin文件;网上的C转bin工具其实就是实现这个功能,只不过包了一层壳而已;
完整函数:

int wfoo()
{FILE *fd;char *fName="gbk.bin";fd=fopen(fName, "w+");if(fd==NULL){perror("fopen fail\n");return -1;}fwrite(GBK_font, sizeof(GBK_font), 1, fd);fclose(fd);return 1;
}
  • 如何解析.bin文件?
    我的想法是全部读出来,按字节打印出来;

    int rfoo(const char name)
    {
    int i=0;
    FILE fd;
    long offset=0;
    unsigned char GBK_font[16
    7614
    2]={0};

     if(access(name, F_OK)!=0){fprintf(stderr, "%s not exist", name);return 0;}fd=fopen(name, "r");if(fd==NULL){perror("fopen fail\n");return -1;}#if 0fseek(fd, 0, SEEK_END);offset = ftell(fd);printf("offset:%d\n", offset);#elsefread(GBK_font, sizeof(GBK_font), 1, fd);for(i=0; i<sizeof(GBK_font); i++){if(i!=0 && i%16==0)printf("\n");printf("0x%02x,", GBK_font[i]);}printf("\n");#endiffclose(fd);return 1;
    

    }

做过黑白屏显示的都知道,生成的1616的中文字库,其实一般都是分上下两部分,即上面8个字节,下面8个字节,主要是和白屏是按页写的原因,姑且这样设计的吧!
其实刚不知道要多大的数组,计算了一下文件的大小,再由每个字符所占空间,计算出一共有多少个字符;
16
16的中文gb字库的每个字符点阵字节数是32【宽16个字节,上下两部分】,
ls -l 该字库大小为 243648
故该字库包含了 7614个字符;
(写一个扫描解析函数,每次解析32个字节,按位解析,即可画出这个字符;为此,写了一个脚本,实现的两种方式,用数字0,1分别代表解析的每一位,把结果写入文件,打开该文件就可以看到字符点阵样子,还可以使用shell终端按颜色打印,把0,1解析为对应的颜色值,这样显示的字符更加直观)。
在这里插入图片描述
在这里插入图片描述
其实,当看到7614个字符时,头都大了,那种编码的字库有7614个字符?找了半天资料也没有答案;
原始方法:一个一个字符画出来,有了上面自制的工具,把解析出来的数组,一个一个打印出来,慢慢的找到了规律;
对比GB2312简体中文编码表:
http://www.knowsky.com/resource/gb2312tbl.htm
逐渐得到一个规律,并不是都乱掉了,
其实是这个字库做了裁剪,去掉了一些无用的字符;
花了一天半,把每个其实字符打印出来,总算去除多余的字符;得到完整的字符库;
至此,有完整的字库,在PCto2002w完美版工具下,导入该文件在选择字体,即可生成想要的自制字库文件。

其实,在生成的字库时还遇到一些问题:

  • 生成的文件后面的注释字符乱码?
    刚开始还以为是生成的字符有问题,取几个特殊易辨别的字符验证一下发现是没问题的;所以需要处理一下。我的做法是函数打开两个文件,按行读文件,把乱码字符用字符文件中的字符替换;期间遇到的问题是需要转码,不然无论怎么替换都是乱码数据;
    其实,如果只为实现替换,这个注释是不会写入到.bin文件的,直接替换到数组里面,再把数组写入文件,后缀为.bin,其实就完成了功能;

  • 如何测试字库是否正确?
    自制字库完成后,上传字库替换minigui自带的字库即可;
    增加,需要修改MiniGUI.cfg配置,新增配置项即可;

对应工具上传到github路径:
https://github.com/first-aid/minigui-bin-font/commits/master

欢迎大家指正完善。


http://www.ppmy.cn/news/217633.html

相关文章

6分32秒售罄!魅族16 X为什么如此受欢迎?

最近手机市场一下子上新了一批新产品&#xff0c;果然9月份被誉为国产手机行业的“金九银十”。其中&#xff0c;魅族在9月19日一口气发布了三款新机型&#xff0c;当中呼声最高的自然是魅族16 X&#xff0c;这款“轻奢旗舰手机”把魅族16th很多配置都保留下来&#xff0c;不过…

Redisson分布式锁使用

一、使用 RedisTemplate 操作分布式锁 原子加锁&#xff08;uuid Value过期时间&#xff09;原子解锁(lua脚本)加长过期时间 UUID &#xff1a;让锁区分&#xff0c;防止错删其他锁设置锁过期时间&#xff1a;当业务异常导致无法释放锁形成锁死&#xff0c;设置过期时间自动释…

现在还有小型计算机吗,电脑诞生到现在小型化始终是趋势_笔记本-中关村在线...

小型化始终是PC行业发展的主线&#xff0c;无论是模具、材料的变化&#xff0c;还是芯片工艺制程、架构的变化&#xff0c;最终目的都是为了使电脑变得更小巧、更便携。 在小型化的趋势的前提下&#xff0c;硬件性能的不断攀升对于普通大众用户而言才能算得上是有意义。否则&am…

软件性能测试 硬件配置,硬件配置及性能测试_笔记本评测-中关村在线

本次收到的战神G8升级版配备了第六代智能英特尔(R)酷睿(TM)i7 6700HQ四核处理器&#xff0c;并安装有两条8GB DDR4 2133内存组成16GB容量&#xff0c;硬盘方面该机配备512GB SSD固态硬盘&#xff0c;显卡方面则是采用最新NVIDIA GeForce GTX 980M独立显卡以及核芯显卡HD 530的组…

中关村 :“迷你本”探秘

12月16日上午&#xff0c;我去北京中关村IT贸易中心区寻觅“迷你本”和MID的踪影&#xff0c;有所发现。所谓“迷你本”是指“Mini-Note PC”&#xff08;这是正规名称&#xff0c;也叫“Netbook”&#xff0c;即“上网本”&#xff09;的爱称&#xff08;pet name&#xff09;…

老人台式计算机,老年人对电脑的真正需求是什么?_笔记本电脑_笔记本新闻-中关村在线...

一体机老年人需求或不同 既然想要抓住老年人用户的心&#xff0c;必然先要了解老年人的需求。现在电脑产品的生产研发基本针对的都是以年轻人为主的广泛用户&#xff0c;虽然适应范围广、研发成本低&#xff0c;但是“大锅饭”怎么能合每个人的“胃口”&#xff0c;所以市场细分…

指纹识别键盘软件测试,防水键盘指纹识别_笔记本评测-中关村在线

屏幕方面&#xff0c;该机搭载了一块12.5英寸的雾面高清屏幕,分辨率为1366768&#xff0c;虽不是全高清但在12寸的机器上完全能够接受。通过软件Spyder5测试可以看出&#xff0c;该屏幕色域达到了61%的sRGB、45%的NTSC&#xff0c;整体色彩漂移处在可接受的范围内&#xff0c;应…

7代服务器cpu型号,七代酷睿都有哪些型号?_笔记本新闻-中关村在线

虽然市场战略从两步走升级到三步走,产品命名也进行了相应改动,但七代酷睿依然延续着英特尔的产品规律,比如桌面版本的Kabe Lake-S系列,移动版本的Kabe Lake-H系列、Kabe Lake-U系列和Kabe Lake-Y系列。 Kabe Lake-Y系列:主要用在2合1设备上 Kabe Lake-U系列:主要用在轻薄…