shell编程/字库裁剪(1)——想法
版权申明:本文为博主窗户(Colin Cai)原创,欢迎转帖。如要转贴,必须注明原文网址 http://www.cnblogs.com/Colin-Cai/p/7679024.html 作者:窗户 QQ:6679072 E-mail:6679072@qq.com
我写这个帖子的意图,在于三个:
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)
我写这个帖子的意图,在于三个: 1.用代码生成代码的思维. 2.shell编程的思路. 3.裁剪字库的具体程序. 我打算分为三节来说: 第一节讲裁剪裁剪词库的意义以及使用场合: 第二节讲如何用shel ...
- 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,可将其理解为分 ...
随机推荐
- zepto的ready方法
zepto中的ready函数是作为$.fn的一个方法,即作为一个zepto对象的方法 readyRE = /complete|loaded|interactive/; ready: function( ...
- 南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
问题 A: 变位词 时间限制: 2 Sec 内存限制: 10 MB提交: 322 解决: 59提交 状态 算法问答 题目描述 请大家在做oj题之前,仔细阅读关于抄袭的说明http://www.bi ...
- iOS UITextfield只允许输入数字和字母,长度限制
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementSt ...
- 个渣渣C语言之数组
---恢复内容开始--- 学c语言就知道数组.指针在c中有着特殊的地位.而且是必须掌握的一项知识,学会它会让你受益无穷. 一.数组 1.数组:室友一系列相同元素构成的.它连续的存储在内存中. 2.数组 ...
- 第一册:lesson thirteen.
原文:A new dress. A:What color's your new dress? B:It' green.Come upstairs and see it. A:Thank you. B: ...
- 【转载】C#生成图片的缩略图
图片处理是C#程序开发中时常会涉及到的一个业务,除了图像的上传.保存以及下载等功能外,根据上传的图片生成一个缩略图也是常见业务,在C#语言中,可以通过Image类提供的相关方法对图片进行操作,如指定宽 ...
- 【Spring】21、用spring目标对象处理Transaction rolled back because it has been marked as rollback-only
在使用spring做事务管理时,很多人都会遇到这样一段异常: org.springframework.transaction.UnexpectedRollbackException: Transact ...
- java算法-单向队列
队列是一种:先进先出,后进后出的数据结构 单项队列: 从前面删除元素,从后面插入元素,跟现实中排队是一样的道理 这里我们用指针移动位置的方法.因为数组删除元素,如果我们要跟现实中排队效果一样,就需要移 ...
- LNMP 一键安装 yum install php-mcrypt libmcrypt libmcrypt-devel
centos源不能安装libmcrypt-devel,由于版权的原因没有自带mcrypt的包 有两种方法解决,一种是使用第三方源,这样还可以使用yum来安装,简单方便,坏处是第三方源多少有中不可靠的感 ...
- css 性能优化小结
1.能用css不用js 1.鼠标悬浮展示 2.自定义radio.checkbox的样式 3.巧用css伪类 当input获取焦点时候,把右边的按钮改变样式 检测用户输入:如果 ...