点阵字库和矢量字库

上传人:桔**** 文档编号:506762899 上传时间:2023-01-02 格式:DOC 页数:12 大小:121KB
返回 下载 相关 举报
点阵字库和矢量字库_第1页
第1页 / 共12页
点阵字库和矢量字库_第2页
第2页 / 共12页
点阵字库和矢量字库_第3页
第3页 / 共12页
点阵字库和矢量字库_第4页
第4页 / 共12页
点阵字库和矢量字库_第5页
第5页 / 共12页
点击查看更多>>
资源描述

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

1、点阵字库的生产原理(转)2011-05-1715:31:45|分类:其他技术|标签:|字号大中小订阅点阵字库的生产原理所有的汉字或者英文都是下面的原理,由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。生成的字库说明:(以12X12例子)前5行、000010101000jOkOh0x802=tlllOOlOQ10Q-00玉000L00100000-0x(2OsOO4:111111111110f肌汁QxeO5:000100100000()m2OxQO一个汉字占用字节数:12宁8=14也就是占用了2X12=24个字节。编码排序AOAOAOFEA1A0A2FE

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

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

4、说明问题.比如说16*1的6点阵,也就是说每一行有16个点,由于一个点使用一个比特来表示,如果这个比特的值为1,则表示这个位置有点,如果这个比特的值为0,则表示这个位置没有点,那么一行也就需要16个比特,而8个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放.第一行的前八个点的数据存放在点阵数据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面,第二行的前八个点的数据存放在点阵数据的第三个字节里面,然后后面的就以此类推了.这样我们可以计算出存放一个点阵总共需要32个字节.看看下面这个图形化的例子:1|1|1|1|1|1|1|1|1|1|1|1|1|11

5、|1|1|1|1|1|1|1|1|1|1|1|1|1|11|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|1|可以看出这是一个汉字的点阵,当然文本的方式效果不是很好.根据上面的原则,我们可以写出这个点阵的点阵数据:0x40,0x08,0x37,0xfc,0xl0,0x08,,当然写这个确实很麻烦所以我不再继续下去.我这样做,也只是为了向你说明,在点阵字库中,每一个点阵的数据就是按照这种方式存放的.当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是8的倍数,比如12*12的点阵,那么这样的点阵数据又是如何存放的呢?其实也很简单,每一行的前

6、面8个点存放在一个字节里面,每一行的剩下的4点就使用一个字节来存放,也就是说剩下的4个点将占用一个字节的高4位,而这个字节的低4位没有使用,全部都默认的为零.这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址.对于其他不规则的点阵,也是按照这个原则进行处理的这样我们可以得出一个的点阵所占用的字节数为在明白了以上所讲的以后我们可以写出一个显示一个任意大小的点阵字模的函数这个函数的功能是输出一个宽度为高度为的字模到屏幕的坐标出文字的颜色为文字的点阵数据为所指输出/字*模的函数*/控制行控制一行中的个点一行中的第几个个点了到点阵数据的第几个字节了控制列位屏蔽字重新计算代码很简单,不用怎么讲解就

7、能看懂,代码可能不是最优化的,但是应该是最易读懂的.其中的函数使用的是提供的中的画点函数使用这个函数就可以完成点阵任意大小的点阵字模的输出.接下来的问题就是如何在汉子库中寻址某个汉子的点阵数据了要解决这个问题首先需要了解汉字在计算机中是如何表示的在计算机中英文可以使用码来表示而汉字使用的是扩展码并且使用两个扩展码来表示一个汉字一个码使用一个字节表示所谓扩展码也就是码的最高位是的码简单的说就是码值大于等于的码一个汉字由两个扩展码组成第一个扩展码用来存放区码第二个扩展码用来存放位码在标准中将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有个汉字在点阵

8、字库中汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中有是按照位的顺序来存放基础上存放的并且将区码和位码码中具体的说就是汉字区码汉字位码的.在汉字的内码中,汉字区位码的存放实在扩展都加上了32然,后存放在两个扩展第一个扩展码第二个扩展吗如果用来表示一个汉字那么我可以计算出这个汉字的区位码为区码位码=hz1-1区8-3区=hz1这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:汉字点阵数据在字库文件中的偏移=区(码(-1)*位9码4)+一*个点阵字模占用的字节数在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了.以下是实现代码:输/出*

9、一个汉字的函数*/足够;大的缓冲/区*,也可以动态分配区码位码计算偏移进行寻址读+入点7阵)数据/绘制字模以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了.英文点阵字库中单个点阵字模数据的存放方式与中文是一模一样的也就是对我们所写的函数同样可以使用到英文字库中唯一不同的是对点阵字库的寻址上英文使用的就是码其码值是0到12寻7址公式为:英文点阵数据在英文点阵字库中的偏移英文的码一个英文字模占用的字节数可以看到区分中英文的关键就是一个字符是码还是扩展码如果是码其范围是到这样是使用的英文字库如果是扩展码则与其后的另一个扩展码组成汉字内码使用中文字库进行显示只要正确区分码的类型并进行分别的处理,

10、也就能实现中英文字符串的混合输出了.点阵字库和矢量字库的差别我们都只知道各种字符在电脑屏幕上都是以一些点来表示的因此也叫点阵最早的字库就是直接把这些点存储起来就是点阵字库常见的汉字点阵字库有等点阵字库也有很多种,主要区别在于其中存储编码的方式不同.点阵字库的最大缺点就是它是固定分辨率的也就是每种字库都有固定的大小尺寸在原始尺寸下使用效果很好但如果将其放大或缩小使用,效果就很糟糕了,就会出现我们通常说的锯齿现象.因为需要的字体大小组合有无数种我们也不可能为每种大小都定义一个点阵字库于是就出现了矢量字库.矢量字库矢量字库是把每个字符的笔划分解成各种直线和曲线然后记下这些直线和曲线的参数在显示的时候

11、,再根据具体的尺寸大小,画出这些线条,就还原了原来的字矢符.它的好处就是可以随意放大缩小而不失真.而且所需存储量和字符大小无关.矢量字库有很多种,区别在于他们采用的不同数学模型来描述组成字符的线条常见的矢量字库有字库和字库在点阵字库中每个字符由一个位图表示如图所示并把它用一个称为字符掩膜的矩阵来表示其中的每个元素都是一位二进制数如果该位为表示字符的笔画经过此位该像素置为字符颜色;如果该位为0,表示字符的笔画不经过此位,该像素置为背景颜色.点阵字符的显示分为两步首先从字库中将它的位图检索出来然后将检索到的位图写到帧缓冲器中.矢矢矢在矢实际应用中,同一个字符有多种字体(如宋体、楷体等),每种字体又

12、有多种大小型号,因此字库的存储空间十分庞大.为了减少存储空间,一般采用压缩技术.矢矢矢矢矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美观、变换方便等优点例如在中使用图形实体形来定义矢量字符其中采用了直线和圆弧作为基本的笔画来对矢量字符进行描述.矢对于字符的旋转、放大、缩小等几何变换,点阵字符需要对其位图中的每个象素进行变换,而矢量字符则只需要对其几何图素进行变换就可以了,例如:对直线笔画的两个端点进行变换,对圆弧的起点、终点、半径和圆心进行变换等等.矢量字符的显示也分为两步.首先从字库中将它的字符信息.然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符.轮廓字

13、形法是当今国际上最流行的一种字符表示方法,其压缩比大,且能保证字符质量.轮廓字形法采用直线、样条曲线的集合来描述一个字符的轮廓线轮廓线构成一个或若干个封闭的平面区域.轮廓线定义加上一些指示横宽、竖宽、基点、基线等等控制信息就构成了字符的压缩数据.如何使用Windows的系统字库生成点阵字库?我的程序现在只能预览一个汉字的不同字体的点阵表达.界面很简单一个输出点阵大小的选择列表等)一个系统中已有的字体名称列表,一个预览按钮,一块画图显示区域.得到字体列表的方法作者称这一段是用来取回系统的字体然后添加到下拉框中)取字体名称列表的回调函数使用前要声明一下该方法pntm,DWORDnFontType,

14、longlParam)说明是我的的类名是列表名称下拉关联的变量调用的地方问题下面那个怎么得到呢)字体预览:如果点阵大小选择显示的时候就画出个方格自定义一个类yt继承自tt用来画图在yt的iOnint函数中计算并显示取得字体常用的方法用ete创建字体,把字etOu再用Getiel取点存入数组缺点必须把字etOU出来,能在屏幕上看见,不爽我的方法,用这个函数GetGlyphOutline()可以得到一个字的轮廓矢量或者位图可以不用teti到屏幕,直接取得字模信息用用用函用数原型如下:OGetGlyphOutline(HDChdc,画图设备句柄UINTuChar,将要读取的字符/汉字/umt,返回数据的格式(字的外形轮廓还是字的位图)Glpgm,结构地址,输出参数Ou输出数据缓冲区的大小Olp输出数据缓冲区的地址o转pm矩阵的地址用用用用);用用用说用明:u字符需要判断是否是汉字还是英文字符中文占个字节长度是输出函数,调用GetGlyphOutline()是无须给lpgm赋值lpn如果不需要转置,将eluee即可lue缓冲f区的大小,可以先通过调用Get

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

当前位置:首页 > 办公文档 > 解决方案

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