在计算机图形学中,字符可以用不同的方式表达和生成。常用的方法有点阵式、矢量式和编码式。
1.点阵式字符
在点阵式字符库中,每个字符都定义成一个称为掩膜的矩阵。矩阵中的元素都是一位二进制数,当该位为1时,表示字符的笔划经过此位,对应于此位的象素应置为字符颜色;当该位为0时,表示字符的笔划不经过此位,对应于此位的象素应置为背景色或不改变。
点阵式字符
4.轮廓字型技术
轮廓字型法采用直线、或者二/三次Bezier曲线的集合来描述一个字符的轮廓线。轮廓线构成一个或若干个封闭的平面区域。轮廓线定义加上一些指示横宽、竖宽、基点、基线等的控制信息,就构成了字符的压缩数据。这种控制信息用于保证字符变倍时引起的字符笔划原来的横宽/竖宽变大变小时,其宽度在任何点阵情况下永远一致。采用适当的区域填充算法,可以从字符的轮廓线定义产生的字符位图点阵,区域填充算法可以用硬件实现,也可以用软件实现。
当对输出字符的要求较高时(如排版印刷),需要使用高质量的点阵字符。对于GB2312-80所规定的6763个基本汉字,假设每个汉字是72X72点阵,那么一个字库就需要72X72X6763/8=4.4兆字节存储空间;不但如此,在实际使用时,还需要多种字体(如基本体、宋体、仿宋体、黑体、楷体等),每种字体又需要多种字号。可见,直接使用点阵字符方法将耗费巨大的存储空间。因此把每种字体、字号的字符都存储一个对应的点阵,在一般情况是不可行的。
解决这个问题一般采用压缩技术。对字型数据压缩后再存储,使用时,将压缩的数据还原为字符位图点阵。压缩方法有多种,最简单的有黑白段压缩法,这种方法简单,还原快,不失真,但压缩较差,使用起来也不方便,一般用于低级的文字处理系统中。另一种方法是部件压缩法。这种方法压缩比大,缺点是字型质量不能保证。三是轮廓字型法,这种方法压缩比大,且能保证字符质量,是当今国际上最流行的一种方法,基本上也被认为是符合工业标准化的方法。
轮廓字型法采用直线、或者二/三次Bezier曲线的集合来描述一个字符的轮廓线。轮廓线构成一个或若干个封闭的平面区域。轮廓线定义加上一些指示横宽、竖宽、基点、基线等的控制信息,就构成了字符的压缩数据。这种控制信息用于保证字符变倍时引起的字符笔划原来的横宽/竖宽变大变小时,其宽度在任何点阵情况下永远一致。采用适当的区域填充算法,可以从字符的轮廓线定义产生的字符位图点阵,区域填充算法可以用硬件实现,也可以用软件实现。
由美国Apple和Microsoft公司联合开发的TrueType字型技术就是一种轮廓字型技术,已被用于为Windows中文版生成汉字字库。当前占领主要的电子印刷市场的我国北大方正和华光电子印刷系统,用的字型技术是汉字字型轮廓矢量法。这种方法能够准确地把字符的信息描述下来,保证了还原的字符质量,又对字型数据进行了大量的压缩。调用字符时,可以任意地放大、缩小或进行花样变化,基本上能满足电子印刷中字型质量的要求。轮廓字型技术有着广泛的应用。到目前为止在印刷行业中使用最多,随着Ms-Windows的大量使用,在CAD、图形学等领域也将变得越来越重要。
点阵式字符将字符表示为一个矩形点阵,由点阵中点的不同值表达字符的形状。常用的点阵大小有5x7、7x9、8x8、16x16等等。图2.4.1(a)所示的字母“P”的点阵式表示例子。在这种8? 8网格中的字形比较粗糙,但当点阵变大时,字型可以做得非常漂亮。
使用点阵式字符时,需将字库中的矩形点阵拷贝到buffer中指定的单元中去。在拷贝过程中,可以施加变换,以获得简单的变化。图2.4.1(b)~(d)列出了P字母原型的一些变化例子。相应的变换算法是:
(a) (b) (c) (d)
图2.4.1 点阵式字符及其变化
图(b)变成粗体字。算法是:当字符原型中每个象素被写入帧缓存寄存器的指定位置xi, yi时,同时被写入xi+1, yi。
图(c)旋转90? 。算法是:把字符原型中每个象素的x, y坐标彼此交换,并使y值改变符号后,再写入帧缓存寄存器的指定位置。
图(d)斜体字。算法是:从底到顶逐行拷贝字符,每隔n行,左移一单元。
此外,还可以对点阵式字符作比例缩放等其他一些简单的变换。但是对点阵式字符作任意角度的旋转等变换,是比较困难的操作。
由于光栅扫描显示器的普遍使用,点阵式字符表示已经成为一种字符表示的主要形式。从字库中读出原字型,经过变换拷贝到buffer中去的操作,经常制成专门的硬件来完成。这就大大加快了字符生成的速度。
2.矢量式字符
在笔式绘图仪上采用矢量型字符比较合适,矢量型字符采用矢量代码序列表示字符的各个笔划。输出一个字符时,系统中字符处理器解释该字符的每个矢量代码,输出对应的矢量,达到产生字符的目的。
矢量式字符
矢量式字符将字符表达为一个点坐标的序列,相邻两点表示一条矢量,字符的形状便由矢量序列刻划。图2.4.2示出用矢量式表示的字符“B”。“B”是由顶点序列{a, b, c, d, e, f, e, g, h, I, j, k ,a, l}的坐标表达。
调用矢量式字符的过程相当于输出一个polyline。由于矢量式字符具有和图形相一致的数据结构,因而可以接受任何对于图形的操作,如放大、旋转,甚至透视。而且,矢量式字符不仅可用于显示,也可用于绘图机输出。
图2.4.2 矢量式表示字符“B”
3.方向编码式字符
方向编码式字符用有限的若干种方向编码来表达一个字符,常用的如8方向编码。方向编码既可用于字符的显示,也可用于字符的绘图机输出。
方向编码式字符用有限的若干种方向编码来表达一个字符,常用的如8方向编码。图2.4.3示出8个方向的编码为0~7,其中编码为偶数和0的固定长度为1,编码为奇数的固定长度为。一个字符就可以表示为一连串方向码。图2.4.4(a)示出字母“B”的方向矢量构成。这样,“B”就表示为8方向编码:{00006}。方向编码式字符很容易被填入帧缓存寄存器中予以显示(图2.4.4(b)),方向编码所占的空间比较小,它也能接受一些特定的变换操作,如按比例在x和y两个方向放大或缩小以及以45? 角为单位的旋转,但难以进行任意角度的旋转。
方向编码既可用于字符的显示,也可用于字符的绘图机输出。