7.1任务线:几种小字库的创建方法和对应的字模提取方式

来源:百度文库 编辑:偶看新闻 时间:2024/04/29 19:19:36
几种小字库的创建方法和对应的字模提取方式
关于点阵字库的读取的文章很多,这里就不再累赘了。直接读取点阵字库文件,虽然比较方便,但是有一定的限制。首先,完整的字库包含超过6000个汉字,体积相对较大,而大多数时候我们只需要显示几百个或更少的汉字。显然此方式不适于空间占用要求高的场合。其次,程序运行时依赖字库,不能独立运行。再者,为了显示在区位相距较远的字,反复长距离移动文件指针,也影响效率。

于是,就有了所谓的“小字库”,剔除没有用到的字模,仅仅把需要的字模提取出来。一般是这样的:

把字模存入特定的名称(如以拼音方式命名)数组,要使用的时候直接从对应的数组读取。

优点:

占用空间极少,读取速度极快!

缺点:

它只适用于汉字极少的情况,和内码无关无法直接通过内码找到字摸,使用时必须手动指定非常麻烦。

直接用位图方式

此种方式用得较少,适应于一次显示一整段字,且重复的字很少的情况。这个不属于小字库的范畴了。

通过回顾标准字库的字摸提取方式,应该可以找出适应于小字库的提取方式。

标准16*16点阵字库的字摸提取流程

 

优点:

由于字模按照标准的区位排列,如果不考虑文件指针的移动消耗,字模的定位提取是相当方便且高效的。直接由内码得到区位码,由区位码定位文件指针。完全不用查找或者判断。这个是标准流程,还可以直接把内码减去0xa1,这样区码和位码可以不减1。

可以支持汉字数量不受限制。

字模位置和区位码相关,使用方便。

缺点:

前面已经提到,这里不再重复。

介绍完标准字库字模提取流程,如果只提取要用到的部分字模,势必会打乱原来的区位排列排列。不能直接用区位码定位了。下面开始介绍针对小字库字模提取另外三种方法。

查找法读取字库


这是比较常用的方法,一般使用自定义数据结构数组,数组中的每个元素包含一个区位码和一个字符数组用于存放字模。建立小字库的时候,把区位码和对应的字模写进数组。这是一个以时间换取空间的方法。

查找法读取字库简单流程

 

优点:

额外内存占用小,几乎不会浪费空间。每个元素储存一个字模,仅仅多用了两个字节来储存区位码。

可以支持汉字数量仅受内存限制。

字模位置和区位码相关,使用方便。

缺点:

速度慢,消耗CPU资源,每读取一个字模都必须经过一番查找和对比。

改进:可以通过优化查找算法,获得稍微改善。

 

码表转换法读取字库


借助表来定位。首先,建立一个94*94的索引表,对应94个区码和位码。再建立一个数组用于储存字模。建立小字库的时候,把字模在数组中位置写入索引表对应的区位。读取的时候直接定位到索引表得到重新编排的字库位置码,所以我姑且称之为码表转换法。这是一种以空间换取时间的方法。

码表转换法读取字库简单流程

 

由于索引表按照标准的区位生成,直接根据区位码访问索引表就可以得到字模位置。

优点:

完全不用查找或者判断,定位效率很高。

可以支持汉字数量仅受内存限制。

字模位置和区位码相关,使用方便。

缺点:索引表会占用额外内存。这个可以说是最致命的也是唯一的缺点。

最糟糕的情况:所谓最糟糕的情况,你用到的字中有包含最高区码和最高位码的。那么他的占用空间是:94*94=8836,如果你需要使用超过256个不同的字,那占用空间就是 94*94=8836*2=17672 [因为单字节能表示的最大数是256],超过17kb,有可能超过字模本身的体积!幸好这种情况不常见。

改进:通常只要使用到的 [最高区号]*[最高位号] 就可以了。还可以优化一下剔除低区位,这时候空间占用为使用到的 [最高区号-最低区号]*[最高位号-最低位号]。总而言之,对于区位比较集中的字,用表驱动法还是比较理想的。

 

Switch法读取字库

通过额外编制一个Switch结构的函数,给出区位码,函数返回字模在数组中位置。建立字库的时候,把区位码作为case值,把字模位置作为 return 值,写入函数。这其实是查找法的变形。

选择法读取字库简单流程

 

优点:

额外内存占用小。

字模位置和区位码相关,使用方便。

缺点:

速度慢,消耗CPU资源,每读取一个字模都必须调用函数。

可以支持汉字数量受case 条数限制,部分编译器支持的case条目少。

改进:取决于不同的编译器对Switch结构的优化。且较高级的编译器支持的case条目,已经足够代表全部区位码。

码表转换法读取字库源程序

Switch法读取字库源程序

16*16点阵字库下载

转载请注明出处 http://blog.csdn.net/PMind


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/PMind/archive/2010/12/15/6078166.aspx