点阵字库和矢量字库

上传人:ji****n 文档编号:46008027 上传时间:2018-06-20 格式:DOC 页数:10 大小:102KB
返回 下载 相关 举报
点阵字库和矢量字库_第1页
第1页 / 共10页
点阵字库和矢量字库_第2页
第2页 / 共10页
点阵字库和矢量字库_第3页
第3页 / 共10页
点阵字库和矢量字库_第4页
第4页 / 共10页
点阵字库和矢量字库_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《点阵字库和矢量字库》由会员分享,可在线阅读,更多相关《点阵字库和矢量字库(10页珍藏版)》请在金锄头文库上搜索。

1、点阵字库的生产原理(转)点阵字库的生产原理(转) 2011-05-17 15:31:45| 分类: 其他技术 | 标签: |字号大中小 订阅 点阵字库的生产原理点阵字库的生产原理所有的汉字或者英文都是下面的原理,由左至右,每 8 个点占用一个字节,最后不足 8 个字节的占用一个字节,而且从最高位向最低位排列。生成的字库说明:(以 1212 例子)一个汉字占用字节数:128=14 也就是占用了 212=24 个字节。编码排序 A0A0A0FE A1A0A2FE 依次排列。以 1212 字库的“我”为例:“我”的编码为 CED2,所以在汉字排在 CEH-AOH=2EH 区的D2H-A0H=32H

2、个。所以在 1212 字库的起始位置就是FE-A0*2EH+32H*24=104976 开始的 24 个字节就是我的点阵模。其他的类推即可。英文点阵也是如此推理。 在在 DOS 程序中使用点阵字库的方法程序中使用点阵字库的方法首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道 的,使用过“文曲星“之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出“点阵“的痕迹.在 PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC 机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此“点阵“的痕迹也就不那么明显

3、了.点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词.点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这 个比特为 0,表示某个位置没有点,如果为 1 表示某个位置有点.矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列.位图就是这种 二维的阵列,这个阵列中的 (x,y) 位置上的数据代表的就是对原始图形进行采样量化后的颜色值.但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的.因此,我们需要 将二维的数据线性化到一维里面去.通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维.那么点阵字的数据存放

4、细节到底是怎么样的呢.其实也十分的简单,举个例子最能说明问题.比如说 16*16 的点阵,也就是说每一行有 16 个点,由于一个点使用一个比特来表示,如果这个比特的值为 1,则表示这个位置有点,如果这个比特的值为 0,则表示这个位置没 有点,那么一行也就需要 16 个比特,而 8 个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放.第一行的前八个点的数据存放在点阵数 据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面,第二行的前八个点的数据存放在点阵数据的第三个字节里面,然后后 面的就以此类推了.这样我们可以计算出存放一个点阵总共需要 32 个字节.

5、看看下面这个图形化的例子:| |1| | | | | | | | | | |1| | | | | |1|1| |1|1|1|1|1|1|1|1|1| | | | | |1| | | | | | | | |1| | | |1| | | | | |1| | | | | |1| | | | |1|1| | | |1| | | | | |1| | | | | |1| | | |1| | | | |1| | | | | | | | |1| | |1| | | |1| | | | | | | |1| | | |1| | |1| | | | | | | |1| | | | | |1| |1| | | | |

6、 |1|1|1| | | | | | |1| | | | | | | | |1| | | | | |1| |1| | | | | | | |1| | | | |1| | | |1| | | | | | |1| | | |1| | | | | |1| | | | | |1| | |1| | | | | | |1|1|1| | | | | |1| | | | | | | | |1| | | | | | | | | | | | | | | | | | |可以看出这是一个“汉“字的点阵,当然文本的方式效果不是很好.根据上面的原则,我们可以写出这个点阵的点阵数 据:0x40,0x08,0x37,0xfc

7、,0x10,0x08, 当然写这个确实很麻烦所以我不再继续下去.我这样做,也只是为了向你说明,在点阵字库中,每一个点阵的数据就是按照这种方式存放的.当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是 8 的倍数,比如 12*12 的点阵,那么这样的点阵数据又是如何存放的呢?其实也很简单,每一行的前面 8 个点存放在一个字节里面,每一行的剩下的 4 点就使用一个字节来存放,也就是说 剩下的 4 个点将占用一个字节的高 4 位,而这个字节的低 4 位没有使用,全部都默认的为零.这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址.对于 其他不规则的点阵,也是按照这个原则进行处理的.

8、这样我们可以得出一个 m*n 的点阵所占用的字节数为 (m+7)/8*n.在明白了以上所讲的以后,我们可以写出一个显示一个任意大小的点阵字模的函数,这个函数的功能是输出一个宽度为 w,高度为 h 的字模到屏幕的 (x,y) 坐标出,文字的颜色为 color,文字的点阵数据为 pdata 所指:/*输出字模的函数*/void _draw_model(char *pdata, int w, int h, int x, int y, int color)int i; /* 控制行 */int j; /* 控制一行中的 8 个点 */int k; /* 一行中的第几个“8 个点“了 */int nc;

9、 /* 到点阵数据的第几个字节了 */int cols; /* 控制列 */BYTE static mask8=128, 64, 32, 16, 8, 4, 2, 1; /* 位屏蔽字 */w = (w + 7) / 8 * 8; /* 重新计算 w */nc = 0;for (i=0; i_hz_buf_size * (ch0 - 1) * 94 + ch1 - 1);fseek(fp, offset, SEEK_SET); /* 进行寻址 */fread(fontbuf, 1, (w + 7) / 8 * h, fp); /* 读入点阵数据 */_draw_model(fontbuf, w

10、, h, x, y, color); /* 绘制字模 */以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了.英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的 _draw_model 函数同样可以使用到英文字库中.唯一不同的是对点阵字库的寻址上.英文使用的就是 ASCII 码,其码值是 0 到 127,寻址公式为:英文点阵数据在英文点阵字库中的偏移 = 英文的 ASCII 码 * 一个英文字模占用的字节数可以看到,区分中英文的关键就是,一个字符是 ASCII 码还是扩展 ASCII 码,如果是 ASCII 码,其范围是 0 到 127,这样是使用的英文字库,如

11、果是扩展 ASCII 码,则与其后的另一个扩展 ASCII 码组成汉字内码,使用中文字库进行显示.只要正确区分 ASCII 码的类型并进行分别的处理,也就能实现中英文字符串的混合输出了. 点阵字库和矢量字库的差别点阵字库和矢量字库的差别我们都只知道,各种字符在电脑屏 幕上都是以一些点来表示的,因此也叫点阵.最早的字库就是直接把这些点存储起来,就是点阵字库.常见的汉字点阵字库有 16x16, 24x24 等.点阵字库也有很多种,主要区别在于其中存储编码的方式不同.点阵字库的最大缺点就是它是固定分辨率的,也就是每种字库都有固定的大小尺寸,在原始尺寸 下使用,效果很好,但如果将其放大或缩小使用,效果

12、就很糟糕了,就会出现我们通常说的锯齿现象.因为需要的字体大小组合有无数种,我们也不可能为每种大小 都定义一个点阵字库.于是就出现了矢量字库.矢量字库矢量字库是把每个字符的笔划分解成各种直线和曲线,然后记下这些直线和曲线的参数,在显示的时候,再根据具体的尺寸大小,画出这些线条,就还原了原来的字 符.它的好处就是可以随意放大缩小而不失真.而且所需存储量和字符大小无关.矢量字库有很多种,区别在于他们采用的不同数学模型来描述组成字符的线条.常 见的矢量字库有 Type1 字库和Truetype 字库.在点阵字库中,每个字符由一个位图表示(如图 2.5 所示),并把它用一个称为字符掩膜的矩阵来表示,其中

13、的每个元素都是一位二进制数,如果该位为 1 表示字 符的笔画经过此位,该像素置为字符颜色;如果该位为 0,表示字符的笔画不经过此位,该像素置为背景颜色.点阵字符的显示分为两步:首先从字库中将它的位图 检索出来,然后将检索到的位图写到帧缓冲器中.在实际应用中,同一个字符有多种字体(如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间十分庞大.为了减少存储空间,一般采用压缩技术.矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美观、变换方便等优点.例如:在 AutoCAD 中使用图形实体-形(Shape)-来定义矢 量字符,其中,采用了直线和圆弧作为基本的笔画来对矢量字符进行描

14、述. 对于字符的旋转、放大、缩小等几何变换,点阵字符需要对其位图中的每个象素进行变换,而矢量字符则只需要对其几何图素进行变换就可以了,例如:对直线笔画 的两个端点进行变换,对圆弧的起点、终点、半径和圆心进行变换等等.矢量字符的显示也分为两步.首先从字库中将它的字符信息.然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符.轮廓字形法是当今国际上最流行的一种字符表示方法,其压缩比大,且能保证字符质量.轮廓字形法采用直线、B 样条/Bezier 曲线的集合来描述一个字符的 轮廓线.轮廓线构成一个或若干个封闭的平面区域.轮廓线定义加上一些指示横宽、竖宽、基点、基线等等控制信息就构成

15、了字符的压缩数据. 如何使用如何使用 Windows 的系统字库生成点阵字库?的系统字库生成点阵字库?我的程序现在只能预览一个汉字的不同字体的点阵表达.界面很简单: 一个输出点阵大小的选择列表(8x8,16x16,24x24 等),一个系统中已有的字体名称列表,一个预览按钮,一块画图显示区域.得到字体列表的方法:(作者称这一段是用来取回系统的字体,然后添加到下拉框中)/取字体名称列表的回调函数,使用前要声明一下该方法int CALLBACK MyEnumFONtProc(ENUMLOGFONTEX* lpelf,NEWTEXTMETRICEX* lpntm,DWORD nFontType,lo

16、ng lParam)CFontPeekerDlg* pWnd=(CFontPeekerDlg*) lParam;if(pWnd)if( pWnd-m_combo_sfont.FindSTring(0, lpelf-elfLogFont.lfFaceName) m_combo_sfont.AddString(lpelf-elfLogFont.lfFaceName);return 1;return 0;/说明:CFontPeekerDlg 是我的 dialog 的类名, m_combo_sfont 是列表名称下拉combobox 关联的 control 变量/调用的地方 (*问题 1:下面那个m_combo_sfont.SetCurSel(0);字体预览:如果点阵大小选择 16,显示的时候就画出 16x1

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号