shell编程/字库裁剪(1)
我写这个帖子的意图,在于三个:
1.用代码生成代码的思维。
2.shell编程的思路。
3.裁剪字库的具体程序。
我打算分为三节来说:
第一节讲裁剪裁剪词库的意义以及使用场合;
第二节讲如何用shell来解决这个问题;
第三节讲如何测试结果。
很多带有点阵液晶的硬件项目可能需要显示汉字、ASCII字符,有的廉价的液晶里没有字库,有的液晶里带有了字库但可能需要其他字体的支持。这种时候我们就需要使用外置的字库了。一般一个字库需要几百K大小,当然对于有外置flash的情况下根本不算什么,但有些时候我们在设计硬件的时候出于硬件成本、PCB尺寸等因素考虑,并不会采用外部存储,现在的嵌入式处理器公司都会在SOC上给一定的flash,足够你正常的编程使用,比如我们熟悉的STM32系列,它由ST公司(意法半导体)出品的基于ARM的SOC,有着自己的相对统一的开发库,可选器件品类繁多,是裸机运行的首选。
SOC上的flash一般尺寸相对很小,几百K的字库很可能超标,甚至本身就没这么大。那么在这种情况下,如果还想使用字库,只好对字库进行裁剪,这也是笔者这个主题的背景情况。当然,也会有FPGA来控制液晶、VGA等情况的时候也需要裁剪字库,但不在我这个的考虑范围内,我这个题材只是针对C语言编程。
我们来试想一下,对于ASCII码,即便是16X8的字库,总共也就2k不到,基本可以完全忍受下来,所以主要考虑裁剪的是汉字。如果是完整的汉字字库,那么显示汉字可以直接根据GB2312码来算出二进制编码,这个可以在baidu里面搜索GB2312字库的偏移,里面可以查到很多文章可以说明GB2312字库的偏移,细节不在这里讨论。直接写结果,GB2312的编码为两个字节,假设某个汉字的GB2312编码第一个字节为GBH,第二个字节为GBL,并且每个汉字字体在字库中的大小为s,那么这个汉字在字库中的偏移为
offset = [ (GBH - 161) * 94 + (GBL - 161) ] * s
一般使用的是16X16字库,那么s=16*16/8=32,当然也有使用其他大小,比如12X12,那么s=12*12/8=18。
如果要用到繁体字,那么可以采用GBK编码和GBK字库,公式类似,本文只考虑GB2312。
在具体应用中,可以对于所有使用的汉字按照编码大小顺序提取,生成一个数组;然后有两种解决方法:
1.再建立一个所使用汉字编码大小顺序的有序数组,在寻找汉字字体的时候采用二分查找法找到汉字编码在数组中的偏移ofs,从而知道所选字体在字体数组中的偏移ofs/2*s。
2.把程序中的汉字都替换成偏移,这可以换来更快的运行速度(虽然只快了那么微小的一点点)和更快的存储,但最后是以牺牲程序可读性为前提的,所以一般情况下不建议如此,代码不仅仅是给机器读也是要给人读的。
shell编程/字库裁剪(1)的更多相关文章
- shell编程/字库裁剪(2)——编程过程
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7704085.html 作者:窗户 Q ...
- shell编程/字库裁剪(1)——想法
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7679024.html 作者:窗户 Q ...
- shell编程/字库裁剪(3)——验证
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖.如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7712496.html 作者:窗户 Q ...
- Linux学习笔记(17) Shell编程之基础
1. 正则表达式 (1) 正则表达式用来在文件中匹配符合条件的字符串,正则是包含匹配.grep.awk.sed等命令可以支持正则表达式:通配符用来匹配符合条件的文件名,通配符是完全匹配.ls.find ...
- shell编程:定义简单标准命令集
shell是用户操作接口的意思,操作系统运行起来后都会给用户提供一个操作界面,这个界面就叫shell,用户可以通过shell来调用操作系统内部的复杂实现,而shell编程就是在shell层次上进行编程 ...
- Linux Shell编程入门
从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...
- Shell编程菜鸟基础入门笔记
Shell编程基础入门 1.shell格式:例 shell脚本开发习惯 1.指定解释器 #!/bin/bash 2.脚本开头加版权等信息如:#DATE:时间,#author(作者)#mail: ...
- Linux_10------Linux之shell编程------变量
.-9 vim num.sh #! /bin/bash num1=$1 num2=$2 sum=$(($num1+$num2)) #变量sum是num1和num2的综合 echo $sum 执行 ./ ...
- 需要交互的shell编程——EOF(转载)
在shell编程中,”EOF“通常与”<<“结合使用,“<<EOF“表示后续的输入作为子命令或子shell的输入,直到遇到”EOF“, 再次返回到主调shell,可将其理解为分 ...
随机推荐
- 201521123069 《Java程序设计》 第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多数据库相关内容. 2. 书面作业 1. MySQL数据库基本操作 建立数据库,将自己的姓名.学号作为一条记录插入.(截图,需出现自 ...
- 201521123002《Java程序设计》第9周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 2. 书面作业 本次作业题集异常 1.常用异常 题目5-1 1.1 截图你的提交结果(出现学号) 1.2 自己 ...
- java第十三次作业
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相内关容. 2. 书面作业 1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu ...
- Java:接口继承接口 (多继承机制)
在看API文档时,突然发现一个接口可以是其他接口的子接口,这说明接口之间会存在继承的关系.查找了相关的资料,做一个总结. 是继承还是实现 首先要搞清楚接口之间的关系使用的关键字是extends还是im ...
- java基础知识3--如何获取资源文件(Java中获取资源文件的url)
java开发中,常见的resource文件有:.xml,.properties,.txt文件等,后台开发中经常用到读取资源文件,处理业务逻辑,然后返回结果. 获取资源文件的方法说明getResourc ...
- Chrome控制台选择器简介
Chrome的控制台是支持用$来获取元素的,这点可能是很多人不知道的.本篇文章将会简单介绍怎样更好的来使用这种快捷方式来获取元素. 判断当前窗口的$是来自谁的 我们知道jQ里面经常使用$来进行元素选择 ...
- 一款简洁而强大的前端框架JQUery—动画效果及剪刀石头布小游戏
jQuery是什么? jQuery是一个快速.简洁的JavaScript框架,它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作.事件处理.动画 ...
- js 递归函数的使用及常用函数
1.递归函数的使用: 公园里有一堆桃子,猴子每天吃掉一半,挑出一个坏的扔掉,第6天的时候发现还剩1个桃子,问原来有多少个桃子 var peache;function peaches(n) { if ( ...
- BZOJ-1012-[JSOI2008]最大数maxnumber(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- noip的一些模板(参考了神牛的博客)
一.图论 1.单源最短路 洛谷P3371 (1)spfa 已加SLF优化 419ms #include <iostream> #include <cstdio> #includ ...