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[1676142]={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 0 fseek(fd, 0, SEEK_END); offset = ftell(fd); printf("offset:%d\n", offset); #else fread(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"); #endif fclose(fd); return 1;
}
做过黑白屏显示的都知道,生成的1616的中文字库,其实一般都是分上下两部分,即上面8个字节,下面8个字节,主要是和白屏是按页写的原因,姑且这样设计的吧!
其实刚不知道要多大的数组,计算了一下文件的大小,再由每个字符所占空间,计算出一共有多少个字符;
1616的中文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
欢迎大家指正完善。