搜档网
当前位置:搜档网 › 点阵字库和矢量字库

点阵字库和矢量字库

点阵字库和矢量字库
点阵字库和矢量字库

点阵字库的生产原理(转)

2011-05-17 15:31:45| 分类:其他技术| 标签:|字号大中小订阅

点阵字库的生产原理

所有的汉字或者英文都是下面的原理,

由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最

低位排列。

生成的字库说明:(以12×12例子)

一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。

编码排序A0A0→A0FE A1A0→A2FE依次排列。

以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的

24个字节就是我的点阵模。

其他的类推即可。

英文点阵也是如此推理。

在DOS程序中使用点阵字库的方法

首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹.在 PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此"点阵"的痕迹也就不那么明显了.

点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词.点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示

某个位置没有点,如果为1表示某个位置有点.矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列.位图就是这种二维的阵列,这个阵列中的 (x,y) 位置上的数据代表的就是对原始图形进行采样量化后的颜色值.但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的.因此,我们需要将二维的数据线性化到一维里面去.通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维.

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

| |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| | | | | |

|1|1|1| | | | | | |1| | | | | | |

| | |1| | | | | |1| |1| | | | | |

| | |1| | | | |1| | | |1| | | | |

| | |1| | | |1| | | | | |1| | | |

| | |1| | |1| | | | | | |1|1|1| |

| | | | |1| | | | | | | | |1| | |

| | | | | | | | | | | | | | | | |

可以看出这是一个"汉"字的点阵,当然文本的方式效果不是很好.根据上面的原则,我们可以写出这个点阵的点阵数据:0x40,0x08,0x37,0xfc,0x10,0x08,…, 当然写这个确实很麻烦所以我不再继续下去.我这样做,也只是为了向你说明,在点阵字库中,每一个点阵的数

据就是按照这种方式存放的.

当然也存在着不规则的点阵,这里说的不规则,指的是点阵的宽度不是8的倍数,比如12*12 的点阵,那么这样的点阵数据又是如何存放的呢?其实也很简单,每一行的前面8个点

存放在一个字节里面,每一行的剩下的4点就使用一个字节来存放,也就是说剩下的4个点将占用一个字节的高4位,而这个字节的低4位没有使用,全部都默认的为零.这样做当然显得有点浪费,不过却能够便于我们进行存放和寻址.对于其他不规则的点阵,也是按照这个原则进行处理的.这样我们可以得出一个 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; /* 到点阵数据的第几个字节了 */

int cols; /* 控制列 */

BYTE static mask[8]={128, 64, 32, 16, 8, 4, 2, 1}; /* 位屏蔽字 */

w = (w + 7) / 8 * 8; /* 重新计算w */

nc = 0;

for (i=0; i

{

cols = 0;

for (k=0; k

{

for (j=0; j<8; j++)

{

if (pdata[nc]&mask[j])

putpixel(x+cols, y+i, color);

cols++;

}

nc++;

}

}

}

代码很简单,不用怎么讲解就能看懂,代码可能不是最优化的,但是应该是最易读懂的.其中的 putpixel 函数,使用的是TC提供的 Graphics 中的画点函数.使用这个函数就可以

完成点阵任意大小的点阵字模的输出.

接下来的问题就是如何在汉子库中寻址某个汉子的点阵数据了.要解决这个问题,首先需要了解汉字在计算机中是如何表示的.在计算机中英文可以使用 ASCII 码来表示,而汉字使用的是扩展 ASCII 码,并且使用两个扩展 ASCII 码来表示一个汉字.一个 ASCII 码使用一个字节表示,所谓扩展 ASCII 码,也就是 ASCII 码的最高位是1的 ASCII 码,简单的说就是码值大于等于 128 的 ASCII 码.一个汉字由两个扩展 ASCII 码组成,第一个扩展ASCII 码用来存放区码,第二个扩展 ASCII 码用来存放位码.在 GB2312-80 标准中,将所有的汉字分为94个区,每个区有94个位可以存放94个汉字,形成了人们常说的区位码,这样总共就有 94*94=8836 个汉字.在点阵字库中,汉字点阵数据就是按照这个区位的顺序来存放的,也就是最先存放的是第一个区的汉字点阵数据,在每一个区中有是按照位的顺序来存放的.在汉字的内码中,汉字区位码的存放实在扩展 ASCII 基础上存放的,并且将区码和位码都加上了32,然后存放在两个扩展 ASCII 码中.具体的说就是:

第一个扩展ASCII码 = 128+32 + 汉字区码

第二个扩展ASCII吗 = 128+32 + 汉字位码

如果用char hz[2]来表示一个汉字,那么我可以计算出这个汉字的区位码为:

区码 = hz[0] - 128 - 32 = hz[0] - 160

位码 = hz[1] - 128 - 32 = hz[1] - 160.

这样,我们可以根据区位码在文件中进行殉职了,寻址公式如下:汉字点阵数据在字库文件中的偏移 = ((区码-1) * 94 + 位码) * 一个点阵字模占用的

字节数

在寻址以后,即可读取汉字的点阵数据到缓冲区进行显示了.以下是实现代码:

/* 输出一个汉字的函数 */

void _draw_hz(char hz[2], FILE *fp, int x, int y, int w, int h, int color)

{

char f ON tbuf[128]; /* 足够大的缓冲区,也可以动态分配 */

int ch0 = (BYTE)hz[0]-0xA0; /* 区码 */

int ch1 = (BYTE)hz[1]-0xA0; /* 位码 */

/* 计算偏移 */

long offset = (long)pf->_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, h, x, y, color); /* 绘制字模 */

}

以上介绍完了中文点阵字库的原理,当然还有英文点阵字库了.英文点阵字库中单个点

阵字模数据的存放方式与中文是一模一样的,也就是对我们所写的 _draw_model 函数同样可以使用到英文字库中.唯一不同的是对点阵字库的寻址上.英文使用的就是 ASCII 码,其

码值是0到127,寻址公式为:

英文点阵数据在英文点阵字库中的偏移 = 英文的ASCII码 * 一个英文字模占用的字

节数

可以看到,区分中英文的关键就是,一个字符是 ASCII 码还是扩展 ASCII 码,如果是ASCII 码,其范围是0到127,这样是使用的英文字库,如果是扩展 ASCII 码,则与其后的另一个扩展 ASCII 码组成汉字内码,使用中文字库进行显示.只要正确区分 ASCII 码的类型

并进行分别的处理,也就能实现中英文字符串的混合输出了.

点阵字库和矢量字库的差别

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

库.

矢量字库

矢量字库是把每个字符的笔划分解成各种直线和曲线,然后记下这些直线和曲线的参数,在显示的时候,再根据具体的尺寸大小,画出这些线条,就还原了原来的字符.它的好处就是可以随意放大缩小而不失真.而且所需存储量和字符大小无关.矢量字库有很多种,区别在于他们采用的不同数学模型来描述组成字符的线条.常见的矢量字库有 Type1字库和

Truetype字库.

在点阵字库中,每个字符由一个位图表示(如图2.5所示),并把它用一个称为字符掩膜的矩阵来表示,其中的每个元素都是一位二进制数,如果该位为1表示字符的笔画经过此位,该像素置为字符颜色;如果该位为0,表示字符的笔画不经过此位,该像素置为背景颜色.点阵字符的显示分为两步:首先从字库中将它的位图检索出来,然后将检索到的位图写到帧缓

冲器中.

在实际应用中,同一个字符有多种字体(如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间十分庞大.为了减少存储空间,一般采用压缩技术.

矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美观、变换方便等优点.例如:在AutoCAD中使用图形实体-形(Shape)-来定义矢量字符,其中,采用了直线和圆弧作为基本的笔画来对矢量字符进行描述. 对于字符的旋转、放大、缩小等几何变换,点阵字符

需要对其位图中的每个象素进行变换,而矢量字符则只需要对其几何图素进行变换就可以了,例如:对直线笔画的两个端点进行变换,对圆弧的起点、终点、半径和圆心进行变换等等.

矢量字符的显示也分为两步.首先从字库中将它的字符信息.然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符.

轮廓字形法是当今国际上最流行的一种字符表示方法,其压缩比大,且能保证字符质量.轮廓字形法采用直线、B样条/Bezier曲线的集合来描述一个字符的轮廓线.轮廓线构成一个或若干个封闭的平面区域.轮廓线定义加上一些指示横宽、竖宽、基点、基线等等控制信

息就构成了字符的压缩数据.

如何使用Windows的系统字库生成点阵字库?

我的程序现在只能预览一个汉字的不同字体的点阵表达.

界面很简单: 一个输出点阵大小的选择列表(8x8,16x16,24x24等),一个系统中已有的字体名称列表,一个预览按钮,一块画图显示区域.

得到字体列表的方法:(作者称这一段是用来取回系统的字体,然后添加到下拉框中) //取字体名称列表的回调函数,使用前要声明一下该方法

int CALLBACK MyEnumF ON tProc(ENUMLOGFONTEX* lpelf,NEWTEXTMETRICEX* l

pntm,DWORD nFontType,long lParam)

{

CFontPeekerDlg* pWnd=(CFontPeekerDlg*) lParam;

if(pWnd)

{

if( pWnd->m_combo_sfont.Find ST ring(0, lpelf->elfLogFont.lfFaceName) <

0 )

pWnd->m_combo_sfont.AddString(lpelf->elfLogFont.lfFaceName);

return 1;

}

return 0;

}

//说明:CFontPeekerDlg 是我的dialog的类名, m_combo_sfont是列表名称下拉

combobox关联的control变量

//调用的地方 (******问题1:下面那个&lf怎么得到呢……)

{

::EnumFontFamiliesEx((HDC) dc,&lf, (FONTENUMPROC)MyEnumFontProc,(LPARAM

) this,0);

m_combo_sfont.SetCurSel(0);

}

字体预览:

如果点阵大小选择16,显示的时候就画出16x16个方格.自定义一个类CMyStatic继承自CStatic,用来画图.在CMyStatic的OnPaint()函数中计算并显示.

取得字体:

常用的方法:用CreateFont创建字体,把字TextOut再用GetPixel()取点存入数组. 缺点:必须把字TextOut出来,能在屏幕上看见,不爽.

我的方法,用这个函数:GetGlyphOutline(),可以得到一个字的轮廓矢量或者位图.可以

不用textout到屏幕,直接取得字模信息

函数原型如下:

DWORD GetGlyphOutline(

HDC hdc, //画图设备句柄

UINT uChar, //将要读取的字符/汉字 UINT uFormat, //返回数据的格式(字的外形轮廓还是字的位图) LPGLYPHMETR ICS lpgm, // GLYPHMETRICS结构地址,输出参数

DWORD cbBuffer, //输出数据缓冲区的大小

LPVOID lpvBuffer, //输出数据缓冲区的地址

CO NS T MAT2 *lpmat2 //转置矩阵的地址

);

说明:

uChar字符需要判断是否是汉字还是英文字符.中文占2个字节长度.

lpgm是输出函数,调用GetGlyphOutline()是无须给lpgm 赋值.

lpmat2如果不需要转置,将 eM11.value=1; eM22.value=1; 即可.

cbBuffer缓冲区的大小,可以先通过调用

GetGlyphOutline(……lpgm, 0, NULL, mat); 来取得,然后动态分配lpvBuffer,再一次调用GetGlyphOutline,将信息存到lpvBuffer. 使用完毕后再释放lpvBuffer.

程序示例:(***问题2:用这段程序,我获取的字符点阵总都是一样的,不管什么字……)

……前面部分省略……

GLYPHMETRICS glyph;

MAT2 m2;

memset(&m2, 0, sizeof(MAT2));

m2.eM11.value = 1;

m2.eM22.value = 1;

//取得buffer的大小

DWORD cbBuf = dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph,

0L, NULL, &m2);

BYTE* pBuf=NULL;

//返回GDI_ERROR表示失败.

if( cbBuf != GDI_ERROR )

{

pBuf = new BYTE[cbBuf];

//输出位图GGO_BITMAP 的信息.输出信息4字节(DWORD)对齐

dc.GetGlyphOutline( nChar, GGO_BITMAP, &glyph, cbBuf, pBuf, &m2

);

}

else

{

if(m_pFont!=NULL)

delete m_pFont;

return;

}

编程中遇到问题:

一开始,GetGlyphOutline总是返回-1,getLastError显示是"无法完成的功能",后来发

现是因为调用之前没有给hdc设置Font.

后来能取得pBuf信息后,又开始郁闷,因为不太明白bitmap的结果是按什么排列的.后来跟踪汉字"一"来调试(这个字简单),注意到了 glyph.gmBlackBoxX 其实就是输出位图的宽度,glyph.gmBlackBoxY就是高度.如果gmBlackBoxX=15,glyph.gmBlackBoxY=2,表示输出的pBuf中有这些信息:位图有2行信息,每一行使用15 bit来存储信息.

例如:我读取"一

":glyph.gmBlackBoxX = 0x0e,glyph.gmBlackBoxY=0x2; pBuf长度cbBuf=8 字

pBuf信息: 00 08 00 00 ff fc 00 00

字符宽度 0x0e=14 则第一行信息

为: 0000 0000 0000 100 (只取到前14位)第二行根据4字节对齐的规则,从0xff开始 1111 1111 1111 110

看出"一"字了吗?呵呵

直到他的存储之后就可以动手解析输出的信息了.

我定义了一个宏#define BIT(n) (1<<(n)) 用来比较每一个位信息时使用

后来又遇到了一个问题,就是小头和大头的问题了.在我的机器上是little endian

的形式,如果我用

unsigned long *lptr = (unsigned long*)pBuf;

//j from 0 to 15

if( *lptr & BIT(j) )

{

//这时候如果想用j来表示写1的位数,就错了

}

因为从字节数组中转化成unsigned long型的时候,数值已经经过转化了,像上例中,

实际上是0x0800 在同BIT(j)比较.

不多说了,比较之前转化一下就可以了if( htonl(*lptr) & BIT(j) )

Unicode中文点阵字库的生成与使用

点阵字库包含两部分信息.首先是点阵字库文件头信息,它包含点阵字库文字的字号、多少位表示一个像素,英文字母与符号的size、起始和结束 unicode编码、在文件中的起始偏移,汉字的size、起始和结束unicode编码、在文件中的起始偏移.然后是真实的点阵数据,即一段段二进制串,每一串表示一个字母、符号或汉字的点阵信息.

要生成点阵字库必须有文字图形的来源,我的方法是使用ttf字体.ttf字体的显示采用的是SDL_ttf库,这是开源图形库SDL的一个扩展库,它使用的是libfreetype以读取和绘制

ttf字体.

它提供了一个函数,通过传入一个Unicode编码便能输出相应的文字的带有alpha 通道的位图.那么我们可以扫描这个位图以得到相应文字的点阵信息. 由于带有alpha通道,我们可以在点阵信息中也加入权值,使得点阵字库也有反走样效果.我采用两位来表示一个点,这样会有三级灰度(还有一个表示透明).

点阵字库的显示首先需要将文件头信息读取出来,然后根据unicode编码判断在哪个区间内,然后用unicode编码减去此区间的起始unicode编码,算出相对偏移,并加上此区间的文件起始偏移得到文件的绝对偏移,然后读出相应位数的数据,最后通过扫描这段二进制串,

在屏幕的相应位置输出点阵字型.

显示点阵字体需要频繁读取文件,因此最好做一个固定大小的缓存,采用LRU置换算法

维护此缓存,以减少磁盘读取.

点阵字库的原理

点阵字库的原理 2010-12-06 17:12:46 分类: 点阵字库的原理(引文) 所有的汉字或者英文都是下面的原理, 由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。 生成的字库说明:(以12×12例子) 一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。 编码排序A0A0→A0FE A1A0→A2FE依次排列。 以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。 其他的类推即可。 英文点阵也是如此推理。 在DOS程序中使用点阵字库的方法 首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹.在PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此"点阵"的痕迹也就不那么明显了. 点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词.点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点.矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列.位图就是这种二维的阵列,这个阵列中的(x,y) 位置上的数据代表的就是对原始图形进行采样量化后的颜色值.但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的.因此,我们需要将二维的数据线性化到一维里面去.通常的做法就是将二维数据按行顺序的存放,这样就线性化到了一维. 那么点阵字的数据存放细节到底是怎么样的呢.其实也十分的简单,举个例子最能说明问题.比如说16*16 的点阵,也就是说每一行有16个点,由于一个点使用一个比特来表示,如果这个比特的值为1,则表示这个位置有点,如果这个比特的值为0,则表示这个位置没有点,那么一行也就需要16个比特,而8个比特就是一个字节,也就是说,这个点阵中,一行的数据需要两个字节来存放.第一行的前八个点的数据存放在点阵数据的第一个字节里面,第一行的后面八个点的数据存放在点阵数据的第二个字节里面,第二行的前八个点的数据存放在点阵数据的

字体库制作的方法和流程哦

字体库制作的方法和流 程哦 Pleasure Group Office【T985AB-B866SYT-B182C-BS682T-STT18】

字体库制作的方法和流程 利用现有程序进行字库制作 如果你是专业字体设计师,那么你一定有过制作一套属于自己的全新的中文字库之梦。但是,毕竟中文字库属大字符集(当然是或大于6763个字符的字库),个人想徒手直接设计一整套中文字体谈何容易!其繁复程度足以使任何人却步。但是,当今世界上图形图像程序软件已经如此发达,难道没有什么办法利用现在已有的通用软件,将复杂的工作简化,使设计师自己可以独立完成这一艰巨的工作的吗本文就时装字体的设计经验,介绍一种相对简单的方法,帮你完成的心愿。这种方法的意义在于能够使得字体设计工作化繁为简。 大前提:如果你仅仅是为了设计新字样或仅只几个字,那么研读本文对你没多大帮助。本文并不介绍新字样的设计。本文是帮你在已产生了字体设计的设想之后,如何利用已有资源、不花费太大力气地将整个字库(6763汉字或更多,如欲英文、数字、标点一起处理的话,包括进来即可)制作出来。因此,你必须会使用图形处理的通用软件,这包括:PhotoShop、Illustrator、CorelDRAW(考虑到字库制作的特殊性,应当以矢量软件为主)。什么程度算是“会使用”本文是在介绍字库设计方法,不是软件教学,所以,软件使用方法点到为止。如果不能看明白,说明你还不会熟练使用,即请自行加强研究。这样做的主要目的是为了在尽量短的文字里多介绍具体方法的关键之处。 关于硬件要求。说起来似乎可笑:介绍软件应用的文章,说什么硬件要求!尽管如此,还是想说说:CPU当然越快越好,硬盘也是越快越大越好。硬盘设定提醒:最好把Windows的临时文档和应用图形图像软件的临时文档不要放到同一分区上,找一个空(没有存放任何文件)的分区更好,另放一张空的物理硬盘最好。如有条件,专门软件可做一个内存虚拟的硬盘,把那些需要倒来倒去的文件放在上面,速度会快不少。关键是内存一定要大。会使用PS的人都知道,如果图大,内存又不很充足的话,PS的某些特效是不能使用的。Illustrator有过之而无不及。即便内存足够充分,也会经常出现out of memory的要求放弃选框。我们最好不要让它出现。内存越大越好。最小 1G。为什么要这么强调计算机的物理指标因为我们希望一次性地将GB2312里面的6763个字符处理完毕,这样才可以达到简化字符操作之目的。所以我们最好把所有文字放在一个文件里。在建立文件的时候,如果有可能,当然建立一个包含6763个汉字的文档。这样才能在以后动作时不必反复操作。这时就看出机器物理指标的重要性了。如果你一时无法满足要求,那么就只好退而求其次,将6763个字分割成为几块,分块处理,也没什么别的,就是麻烦点。 具体方法 1. 启动PS,将现有字体按照需要排列在一起,位图化。注意:1,字与字之间留有足够的空隙,以免在分割字符的时候相互影响。2,字要足够大,一般应当在10cm10cm 以上,否则矢量化的时候,精密程度会受影响。 2. 按照事先的设想,对每一个字的位图笔画进行分层划分,一层一种笔画。例如1层,丶;2层,一;3层,丨;4层,丿;5层…….汉字所有不同的笔画加在一起,大

单片机用矢量字库的C语言调用

单片机用矢量字库的C语言调用 用TFT 320 X 240分辨路的液晶屏的显示效果如下图: 本文演示了用STM8S的单片机调用矢量模块的宋体,黑体字符。模块大小比一元硬币稍大,目前该模块已经批量生产,该模块采用SPI串行总线作为数据接口,包含汉字一二三四级字库,生僻字库,以及汉字的标点符号,数字符号,特殊符号,希腊字母,采用几何学中二次B样条曲线及直线来描述字体的外形轮廓,既可以作打印字体,又可以用作屏幕显示;由于它是由指令对字形进行描述,因此它与分辨率无关,输出时总是按照打印机的分辨率输出。无论放大或缩小,字符总是光滑的,不会有锯齿出现。目前可输出16X16点阵到256X256点阵大小的汉字和字母字符,使用方便,速度较快。适合打印机等行业采用,本模块采用3.3V 供电,工作温度在-25~+80℃ 引脚顺序为1:CS# (模块片选控制脚),2:SO(数据输出脚)3:BUSY_G(芯片忙判断脚)4:地线,5:SI(数据输入脚)6:CLK(时钟输入脚),7:RESET(芯片复位脚),8:VCC(芯片电源脚),本模块使用简单,硬件连接示意图如下: 硬件连接示意图

本例采用STM8来驱动该模块,流程为: 以ST的低端单片机STM8为例的读取过程:实现程序如下: void Delay(unsigned long nCount) { for(; nCount!=0; nCount--); } ;

int main() { unsigned int n=0; zk_data[0]=0x03; //表示显示的是宋体的字符 zk_data[1]=0x30; //汉字长度48 zk_data[2]=0x30; //汉字宽度48 zk_data[3]=0x30; //汉字厚度48 RCC_Configuration(); GPIO_Configuration(); TFT_Init(); clr_TFT(); RSTL; //模块复位 Delay(140); RSTH; Delay(140); for(n=0;n<4;n++) { Send_Byte(zk_data[n]);//发送要显示的字体风格,字体大小。设置一次即可。 Delay(14); } while(1) { unsigend char *text="啊"; for(n=0;n<2;n++) //将啊字的信息发送到模块 { CS_L2; Delay(14); Send_Byte(*text,*(text+1)); Delay(14); CS_H2; } while(CBUSY==SET); //判忙,等待模块内部处理完毕 for(n=0;n<288;n++) //开始接收啊字的数据排置为横置横排 { CS_L2; Delay(14); Bits[n]=Get_Byte(); Delay(14); CS_H2; } Display(Bits,9,10,48,48,0xf800,0x00ff); //将啊字的数据送到TFT液晶屏上面显示 Delay(144);

GUI原理4 - 矢量字体

说起矢量字体,不得不说一下多边形填充原理。本来是想将多边形填充作为单独的一节内容,可惜说得太细我累大家也累。 多边形填充最需要关注的就是斜率,计算每条边的斜率,从而得到每条边在每一行上的切点。然后从左到右,将各切点连接起来,逐行进行。 多边形有两种填充方式,Alternate和Winding。矢量字体主要用的前一种方式,而winding会将所有的切点都连接起来,没有了中间的分隔区域。 比如,在Alternate模式下,从最左边的切点1,会连接切点2,然后从切点3连接到切点4,而2到3是不连接的。这样就形成了一个空洞,也是矢量字的奥秘所在。Winding模式会将所有的切点都连接起来,即从最左边的一直画到最右边。 FillMode

多边形组——PolyPolygon 将多个多边形组合成一个组,从而形成复杂的多边形组。同样,这个组也依赖于FillMode的填充模式。下面我们来看一下中文的“口”是如何写出来的。 “口”由两条多边形组合而成,根据FillMode为Alternate,相重叠的部分不显示。用笔在字的中央画一条横线,就可以找到4个交点,而交点2到3是不连接的,这样就形成了“口”中间的洞。

微软Arial字体中“S”的曲线 微软的Arial字体中存储的“S”,就是多个Bezier3点组成的。点41是锚点,而40和42是控制点,来控制通过41的曲线的张力。在点的定义上,有on curve和not on curve两种,通常将在曲线上的点定为锚点,而不在曲线上的点为控制点。 这是我年初的时候,为了研究矢量字体,将字母P用微软的方式输出后,再读取字库点阵数据,使用红叉画出字库中所有的点。P是由两条Bezier曲线包围而成的,第二条起着切割的目的,已形成P中间的圆洞。 看看字母“B”的填充。 字体是如何保证对齐的呢?原来在字库内部,有一个基准线,就好像信纸的虚线,用来水平方向对齐的,同样,也有个垂直方向的基准线。每个字都有上浮和下沉的高度,这也是该字的最上和最下的点所处的位置。

字体库制作的方法和流程(免费哦)

字体库制作的方法和流 程 利用现有程序进行字库制作 如果你是专业字体设计师,那么你一定有过制作一套属于自己的全新的中文字库之梦。但是,毕竟中文字库属大字符集(当然是或大于6763个字符的字库),个人想徒手直接设计一整套中文字体谈何容易!其繁复程度足以使任何人却步。但是,当今世界上图形图像程序软件已经如此发达,难道没有什么办法利用现在已有的通用软件,将复杂的工作简化,使设计师自己可以独立完成这一艰巨的工作的吗?本文就时装字体的设计经验,介绍一种相对简单的方法,帮你完成的心愿。这种方法的意义在于能够使得字体设计工作化繁为简。 大前提:如果你仅仅是为了设计新字样或仅只几个字,那么研读本文对你没多大帮助。本文并不介绍新字样的设计。本文是帮你在已产生了字体设计的设想之后,如何利用已有资源、不花费太大力气地将整个字库(6763汉字或更多,如欲英文、数字、标点一起处理的话,包括进来即可)制作出来。因此,你必须会使用图形处理的通用软件,这包括:PhotoShop、Illustrator、CorelDRAW(考虑到字库制作的特殊性,应当以矢量软件为主)。什么程度算是“会使用”?本文是在介绍字库设计方法,不是软件教学,所以,软件使用方法点到为止。如果不能看明白,说明你还不会熟练使用,即请自行加强研究。

这样做的主要目的是为了在尽量短的文字里多介绍具体方法的关键之处。 关于硬件要求。说起来似乎可笑:介绍软件应用的文章,说什么硬件要求?!尽管如此,还是想说说:CPU当然越快越好,硬盘也是越快越大越好。硬盘设定提醒:最好把Windows的临时文档和应用图形图像软件的临时文档不要放到同一分区上,找一个空(没有存放任何文件)的分区更好,另放一张空的物理硬盘最好。如有条件,专门软件可做一个内存虚拟的硬盘,把那些需要倒来倒去的文件放在上面,速度会快不少。关键是内存一定要大。会使用PS的人都知道,如果图大,内存又不很充足的话,PS的某些特效是不能使用的。Illustrator有过之而无不及。即便内存足够充分,也会经常出现out of memory的要求放弃选框。我们最好不要让它出现。内存越大越好。最小1G。为什么要这么强调计算机的物理指标?因为我们希望一次性地将GB2312里面的6763个字符处理完毕,这样才可以达到简化字符操作之目的。所以我们最好把所有文字放在一个文件里。在建立文件的时候,如果有可能,当然建立一个包含6763个汉字的文档。这样才能在以后动作时不必反复操作。这时就看出机器物理指标的重要性了。如果你一时无法满足要求,那么就只好退而求其次,将6763个字分割成为几块,分块处理,也没什么别的,就是麻烦点。 具体方法

矢量小字库制作

矢量小字库制作步骤 1.建立一个test.txt文档,其中输入创建小字库需要的中文字(英文默认添加),去掉重复 的汉字,请保持汉字唯一性。 示例:函数常用于再分配一个以存在构 2.用UE打开该testx.txt文档,使用Ctrl+H键,切换成16进制显示。选择“文件---转换 ---ASCII Unicode”按钮,既得出这些汉字的Unicode索引。(FF FE 是Unicode编码的标识符,有效数据从第三位开始,两个字节表示一个汉字) 3.打开FontCreator,选择“File---Open---Font file”,查找并打开FontSTB.ttf文件,里面包 含了基础的英文和数字。再次选择“File---Open---Installed Font”,会出现windows里的字库文件,选择你需要的字体文件打开,(我们现在选择的是楷体-GB2312:SIMKAI.TTF). 4.选择FontSTB.ttf页卡,选择“Insert—Characters”,会出现Insert Characters卡,在Font 选项中选择刚才添加Windows的那个字库(我们现在选择的是楷体-GB2312:SIMKAI.TTF),在最下面一条输入行里(Add these characters and/or character ranges….)依次输入test.txt 中字符的Unicode编码,输入格式$xxxx(注意字符Unicode编码输入顺序,参考图1中顺序)比如字符”函数”,$51FD, $6570.添加完成后,点击OK。

5.这样会在刚才的FontSTB.ttf页卡中增加N个空白的字符框,N等于你要添加的字符个数。 点击其中一个字符框,右键,选择“Caption—Symbol Chars“,所有的字符框头上显示的数字就是这个字符所对应的Unicode码,也就是刚才你输入的数字,如果输入错误,需要改变,点击右键,选择”Properties---Mappings“,在Mappings选项框内选择对应的数值,点击右边的”Delete”,然后在上面的V alue中输入正确的Unicode码,点击Add,最好点击OK,完成修改。 6.这样就完成了小字库的索引建立,还差字图信息,还是依次添加. 下面以汉字”函”字为 例说明,选择刚才打开的windows字库所对应的页卡(楷体-GB2312:SIMKAI.TTF),然后选择“Edit—Search---Mapping”,在Platforms选项框中选择Microsoft Unicode BMP Only,然后在右面数值输入框中输入”函”字的Unicode码,,这是点击Find.这时就在windows 字库页卡中找到了汉字“函”,然后拷贝(CTRL+C),这时切换页卡到FontSTB.ttf页卡,选择“函”字对应的空白字符框,黏贴(CTRL+V),这时”函”字的字图信息就添加OK了,然后依次添加其他字符。

点阵字库和矢量字库性能的比较

点阵字库和矢量字库性能的比较 矢量字符的显示也分为两步。首先从字库中将它的字符信息。然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符。 矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美观、变换方便等优点。例如:在AutoCAD中使用图形实体-形(Shape)-来定义矢量字符,其中,采用了直线和圆弧作为基本的笔画来对矢量字符进行描述。 对于字符的旋转、放大、缩小等几何变换,点阵字符需要对其位图中的每个象素进行变换,而矢量字符则只需要对其几何图素进行变换就可以了,例如:对直线笔画的两个端点进行变换,对圆弧的起点、终点、半径和圆心进行变换等等。 在实际应用中,同一个字符有多种字体(如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间分庞大。为了减少存储空间,一般采用压缩技术。 在点阵字库中,每个字符由一个位图表示(如图2、5所示),并把它用一个称为字符掩膜的矩阵来表示,其中的每个元素都是一位二进制数,如果该位为1表示字符的笔画经过此位,该像素置为字符颜色;如果该位为0,表示字符的笔画不经过此位,该像素置为背景颜色。点阵字符的显示分为两步:首先从字库中将它的位图检索出来,然后将检索到的位图写到帧缓冲器中。

矢量字库是把每个字符的笔划分解成各种直线和曲线,然后记下这些直线和曲线的参数,在显示的时候,再根据具体的尺寸大小,画出这些线条,就还原了原来的字符。它的好处就是可以随意放大缩小而不失真。而且所需存储量和字符大小无关。矢量字库有很多种,区别在于他们采用的不同数学模型来描述组成字符的线条。常见的矢量字库有 Type1字库和Truetype字库。 矢量字库我们都只知道,各种字符在电脑屏幕上都是以一些点来表示的,因此也叫点阵。最早的字库就是直接把这些点存储起来,就是点阵字库。常见的汉字点阵字库有16x16,24x24 等。点阵字库也有很多种,主要区别在于其中存储编码的方式不同。点阵字库的最大缺点就是它是固定分辨率的,也就是每种字库都有固定的大小尺寸,在原始尺寸下使用,效果很好,但如果将其放大或缩小使用,效果就很糟糕了,就会出现我们通常说的锯齿现象。因为需要的字体大小组合有无数种,我们也不可能为每种大小都定义一个点阵字库。于是就出现了矢量字库。

矢量字体

矢量字体 简介 矢量字体(Vector font)中每一个字形是通过数学曲线来描述的,它包含了字形边界上的关键点,连线的导数信息等,字体的渲染引擎通过读取这些数学矢量,然后进行一定的数学运算来进行渲染。这类字体的优点是字体实际尺寸可以任意缩放而不变形、变色。矢量字体主要包括 Type1 、TrueType、OpenType等几类。 又叫Outline font,通常使用贝塞尔曲线,绘图指令和数学公式进行绘制。这样可以在对字体进行任意缩放的时候保持字体边缘依然光滑,字体色素不会丢失。 编辑本段分类 目前主流的矢量字体格式有3种:Type1,TrueType和OpenType,这三种格式都是平台无关的。 Type1全称PostScript Type1,是1985年由Adobe公司提出的一套矢量字体标准,由于这个标准是基于PostScript Description Language(PDL),而PDL又是高端打印机首选的打印描述语言,所以Type1迅速流行起来。但是Type1是非开放字体,Adobe对使用Type1的公司征收高额的使用费。 TrueType是1991年由Apple公司与Microsoft公司联合提出另一套矢量字标准。 Type1使用三次贝塞尔曲线来描述字形,TrueType则使用二次贝塞尔曲线来描述字形。所以Type1的字体比TrueType字体更加精确美观。一个误解是,Type1字体比TrueType字体占用空间多。这是因为同样描述一个圆形,二次贝塞尔曲线只需要8个关键点和7段二次曲线;而三次贝塞尔曲线则需要12个关键点和11段三次曲线。然而实际情况是一般来说 Type1比TrueType要小10%左右。这是因为对于稍微复杂的字形,为了保持平滑,TrueType必须使用更多的关键点。由于现代大部分打印机都是使用PDL作为打印描述语言,所以True1字体打印的时候不会产生形变,速度快;而TrueType则需要翻译成PDL,由于曲线方程的变化,还会产生一定的形变,不如Type1美观。 这么说来,Type1应该比TrueType更具有优势,为什么如今的计算机上TrueType反而比Type1使用更广泛呢?这是因为第一:Type1由于字体方程的复杂,所以在屏幕上渲染的时候,花费的时间多,解决方案是大部分Type1字体嵌入了点阵字体,这样渲染快,但是边缘不光滑,比较难看。

点阵字库的原理及与矢量字库的差别

点阵字库的原理及与矢量字库的差别 点阵字库的生产原理 所有的汉字或者英文都是下面的原理,由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。 生成的字库说明:(以12×12例子) 一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。 编码排序A0A0→A0FE A1A0→A2FE依次排列。 以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。 其他的类推即可。 英文点阵也是如此推理。 在DOS程序中使用点阵字库的方法 首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据。至于什么是点阵,我想我不讲大家都知道的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹。在PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此"点阵"的痕迹也就不那么明显了。 点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词。点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点。矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列。位图就是这种二维的阵列,这个阵列中的(x,y)位置上的数据代表的就是对原始图形进行采样量化后的颜色值。但是,另一方面,我们要面对的问题是,计算机中数据的存放都是一维的,线性的。因此,我们需要将

点阵字库和矢量字库性能的比较

点阵字库和矢量字库性能的比较 文章由合肥明园点阵字https://www.sodocs.net/doc/f312575147.html,编辑发布 轮廓字形法是当今国际上最流行的一种字符表示方法,其压缩比大,且能保证字符质量。轮廓字形法采用直线、B样条/Bezier曲线的集合来描述一个字符的轮廓线。轮廓线构成一个或若干个封闭的平面区域。轮廓线定义加上一些指示横宽、竖宽、基点、基线等等控制信息就构成了字符的压缩数据。 矢量字符的显示也分为两步。首先从字库中将它的字符信息。然后取出端点坐标,对其进行适当的几何变换,再根据各端点的标志显示出字符。 矢量字符记录字符的笔画信息而不是整个位图,具有存储空间小,美观、变换方便等优点。例如:在AutoCAD中使用图形实体-形(Shape)-来定义矢量字符,其中,采用了直线和圆弧作为基本的笔画来对矢量字符进行描述。对于字符的旋转、放大、缩小等几何变换,点阵字符需要对其位图中的每个象素进行变换,而矢量字符则只需要对其几何图素进行变换就可以了,例如:对直线笔画的两个端点进行变换,对圆弧的起点、终点、半径和圆心进行变换等等。 在实际应用中,同一个字符有多种字体(如宋体、楷体等),每种字体又有多种大小型号,因此字库的存储空间十分庞大。为了减少存储空间,一般采用压缩技术。 在点阵字库中,每个字符由一个位图表示(如图2.5所示),并把它用一个称为字符掩膜的矩阵来表示,其中的每个元素都是一位二进制数,如果该位为1表示字符的笔画经过此位,该像素置为字符颜色;如果该位为0,表示字符的笔画不经过此位,该像素置为背景颜色。点阵字符的显示分为两步:首先从字库中将它的位图检索出来,然后将检索到的位图写到帧缓冲器中。 矢量字库是把每个字符的笔划分解成各种直线和曲线,然后记下这些直线和曲线的参数,在显示的时候,再根据具体的尺寸大小,画出这些线条,就还原了原来的字符。它的好处就是可以随意放大缩小而不失真。而且所需存储量和字符大小无关。矢量字库有很多种,区别在于他们采用的不同数学模型来描述组成字符的线条。常见的矢量字库有Type1字库和Truetype字库。 矢量字库 我们都只知道,各种字符在电脑屏幕上都是以一些点来表示的,因此也叫点阵。最早的字库就是直接把这些点存储起来,就是点阵字库。常见的汉字点阵字库有16x16,24x24 等。点阵字库也有很多种,主要区别在于其中存储编码的方式不同。点阵字库的最大缺点就是它是固定分辨率的,也就是每种字库都有固定的大小尺寸,在原始尺寸下使用,效果很好,但如果将其放大或缩小使用,效果就很糟糕了,就会出现我们通常说的锯齿现象。因为需要的字体大小组合有无数种,我们也不可能为每种大小都定义一个点阵字库。于是就出现了矢量字库。

点阵字库

点阵字库 一. 什么是点阵字库? 我们先了解什么是点阵,简单的说,点阵就是一幅位图。一般默认都指单色位图,即它是用一个bit表示一个点(像素);其实还有灰阶点阵字库(抗锯齿)和彩色点阵字库(绚丽,但不实用),即多个bit表示一个点(像素)。 点阵字库是指多个(>=1)字符的点阵信息的集合,亦可理解为位图组合。 二. 编码格式 目前主要分内码字库和Unicode字库。 (之前项目中应用的是GBK的内码字库,如果要显示日文则无能为力了,目前引入了UNICODE的点阵字库,解决了多语言显示的问题。) 三. 存储格式 目前主要分为“Not Fixed” 和“Height Fixed”。 Not Fixed:自适应宽高。 Height Fixed:等高非等宽。

Not Fixed Height Fixed 四. 输出格式 输出格式是将字符点阵信息以不同的方式存放,反应给用户。 (目前修改使用的是bin输出格式,当然这是指个名字)五.增加日语等多国语言显示工作流程

六.字库生成工具及示例 步骤说明: 如上图示,分5 步。 1. 选择矢量字库文件(*.ttf)或bdf 格式文件(.bdf). A.先将c:\windows\fonts 目录下的字体文件拷贝(ctrl+c)出来,然后本软件即可选择。 B.建议去网上找一个ArialUni.ttf 字库 下载地址:https://www.sodocs.net/doc/f312575147.html,/f/4942778.html 2. 选择编码格式,转换模式,字体大小,DPI. 3. 选择需要支持的字符集。 4. 设置输出文件类型,及输出路径。 5. 点击build 按钮,转换生成字库。 补充说明:

AutoCAD的汉字矢量字库

AutoCAD汉字矢量字库 1Cbs-hztxt. shx汉字简体(仿宋),中英文单线,英文稍大。 2Chin2 . shx汉字宋体,中英文单线,英文小。 3China . shx汉字宋体空心,英文单线,中英文大小统一。 4Chinese . shx汉字仿宋体单线,英文单线,中英文大小统一。 5complex. shx不支持中文,英文双线。 6FS64f . shx汉字简体(楷体)空心字,英文单线,稍大。 7FS64S . shx汉字简体(楷体)实心字,英文单线,大小一致。 8Fstxt . shx汉字仿宋体单线,英文单线,中英文大小统一。 9gbcbig . shx汉字简体(长仿宋)单线,英文三线,稍宽。 10gothice 哥特式英文字体。 11gothicg 哥特式德文字体 12gothici 哥特式意大利文字体。 13greekc 这种字体是Greek 字体的繁体(双笔划,有衬线) 14greeks 这种字体是Greek 字体的简体(单笔划,无衬线) 15hhzfs . shx汉字楷体实心,英文单线,英文稍大。 16hhzft . shx汉字楷体空心,英文单线,英文稍大。 17hhzftxt . shx汉字仿宋体单线,英文单线,中英文大小统一。 18ht . shx汉字黑体空心,英文单线,大小一致。 19hts . shx汉字黑体实心,英文单线,大小一致。 20Hzdg . shx汉字简体(仿宋),中英文单线,英文稍大。 21Hzdx . shx汉字简体(楷体),中英文单线,大小一致。 22Hzfs . shx汉字简体(仿宋),中英文单线,英文稍大。 23hznum. shx汉字幼体,中英文单线,大小完全一致。 24hztxt . shx汉字简体(长宋体)单线,英文单线,大小不一。 25Hztxt0 . shx汉字仿宋体单线,英文单线,大小一致。 26Hztxtb.shx汉字简体(仿宋),中英文单线,大小一致。 27Hztxts.shx汉字简体(仿宋)双线,英文单线,大小一致。 28hztxz1. shx汉字简体(宋体)英文单线,大小一致。 29Hztxz2 . shx汉字简体(宋体)空心字,英文单线,大小统一。 30italicc 这种字体是italic 字体的繁体(双笔划,有衬线)。 31italict 这种字体是三笔划的italic 字体(三笔划,有衬线)。 32kkhz . shx汉字简体(长楷体)空心字,英文单线,英文稍大。 33kshz . shx汉字简体(长宋体)空心字,英文单线,大小统一。 34 Kt64f . shx汉字简体(楷体)空心字,英文空心字,大小统一。 35monotxt等宽的txt 字体。在这种字体中,除了分配给每个字符的空间大小相同(等宽)以外,其他所有的特征都与txt 字体相同。因此,这种字体尤其适合于书写明细表或在表格中需要垂直书写文字的场合。 36pdahztxt . shx汉字简体(仿宋带边)单线,英文双线,大小统一。 37romanc 这种字体是roman 字体的繁体(双笔划,有衬线) 38romand 这种字体与romans 字体相似,但它是使用双笔划定义的。该字体能产生更粗、颜色更深的字符,特别适用于在高分辨率的打印机(如激光打印机)上使用。 39romans 这种字体是由许多短线段绘制的roman 字体的简体(单笔划绘制,没有衬线)。该字体可以产生比txt 字体看上去更为单薄的字符。

UCDOS中的点阵字库HZK

UCDOS中的点阵字库HZK12 UCDOS中的点阵字库HZK12,HZK16,HZK24,ASC12,ASC16[转] 2009年03月10日星期二 13:40 如何在嵌入式系统中使用大量的汉字和字符呢 DOS前辈们经过艰辛的努力,将制作好的字模放到了一个个标准的库中以免去后辈的麻烦,这就是点阵字库文件。 一般我们使用16*16的点阵宋体字库,所谓16*16,是每一个汉字在纵、横各16点的区域内显示的。不过后来又有了HZK12、HZK24,HZK32和HZK48字库及黑体、楷体和隶书字库。虽然汉字库种类繁多,但都是按照区位的顺序排列的。前一个字节为该汉字的区号,后一个字节为该字的位号。每一个区记录94个汉字,位号则为该字在该区中的位置。 因此,汉字在汉字库中的具体位置计算公式为:94*(区号-1)+位号-1。减1是因为数组是以0为开始而区号位号是以1为开始的。这仅为以汉字为单位该汉字在汉字库中的位置,那么,如何得到以字节为单位得到该汉字在汉字库中的位置呢只需乘上一个汉字 字模占用的字节数即可,即:(94*(区号-1)+位号-1)*一个汉字字模占用字节数,而按每种汉字库的汉字大小不同又会得到不同的结果。以16*16点阵字库为例,计算公式则为:(94*(区号-1)+(位号 -1))*32。汉字库文该从该位置起的32字节信息即记录了该字的字模信息。 ☆打印字库文件和HZK12 如果你有UCDOS的HZK24S(宋体)、HZK24K(楷体)或HZK24H (黑体),你还可以使用不同字体的大字模汉字了。HZK24系列是24*24的点阵字库,每字模占用3*24字节。如果你按照HZK16的显示方法的话,你会看到......呵呵,字被放倒了。这是因为该类字库与一般的汉字库不同,这类大字模汉字库是专供打印的打印字库,为了打印的方便将字模都放倒了,你使用时,只要将字模的位信息纵横转置显示即可。例如你如果定义为mat[24][3]则应该这样输出: for(i=0;i<24;i++) for(j=0;j<24;j++) if((0x80>>i%8)&mat[j][i/8]) /*转置显示*/ putpixel(j+x,y+i,color);

字体库制作的方法和流程

字体库制作的方法和流程 利用现有程序进行字库制作 如果你是专业字体设计师,那么你一定有过制作一套属于自己的全新的中文字库之梦。但是,毕竟中文字库属大字符集(当然是或大于6763个字符的字库),个人想徒手直接设计一整套中文字体谈何容易!其繁复程度足以使任何人却步。但是,当今世界上图形图像程序软件已经如此发达,难道没有什么办法利用现在已有的通用软件,将复杂的工作简化,使设计师自己可以独立完成这一艰巨的工作的吗?本文就时装字体的设计经验,介绍一种相对简单的方法,帮你完成的心愿。这种方法的意义在于能够使得字体设计工作化繁为简。 大前提:如果你仅仅是为了设计新字样或仅只几个字,那么研读本文对你没多大帮助。本文并不介绍新字样的设计。本文是帮你在已产生了字体设计的设想之后,如何利用已有资源、不花费太大力气地将整个字库(6763汉字或更多,如欲英文、数字、标点一起处理的话,包括进来即可)制作出来。因此,你必须会使用图形处理的通用软件,这包括:PhotoShop、Illustrator、CorelDRAW(考虑到字库制作的特殊性,应当以矢量软件为主)。什么程度算是“会使用”?本文是在介绍字库设计方法,不是软件教学,所以,软件使用方法点到为止。如果不能看明白,说明你还不会熟练使用,即请自行加强研究。这样做的主要目的是为了在尽量短的文字里多介绍具体方法的关键之处。 关于硬件要求。说起来似乎可笑:介绍软件应用的文章,说什么硬件要求?!尽管如此,还是想说说:CPU当然越快越好,硬盘也是越快越大越好。硬盘设定提醒:最好把Windows 的临时文档和应用图形图像软件的临时文档不要放到同一分区上,找一个空(没有存放任何文件)的分区更好,另放一张空的物理硬盘最好。如有条件,专门软件可做一个内存虚拟的硬盘,把那些需要倒来倒去的文件放在上面,速度会快不少。关键是内存一定要大。会使用PS的人都知道,如果图大,内存又不很充足的话,PS的某些特效是不能使用的。Illustrator 有过之而无不及。即便内存足够充分,也会经常出现out of memory的要求放弃选框。我们最好不要让它出现。内存越大越好。最小1G。为什么要这么强调计算机的物理指标?因为我们希望一次性地将GB2312里面的6763个字符处理完毕,这样才可以达到简化字符操作之目的。所以我们最好把所有文字放在一个文件里。在建立文件的时候,如果有可能,当然建立一个包含6763个汉字的文档。这样才能在以后动作时不必反复操作。这时就看出机器物理指标的重要性了。如果你一时无法满足要求,那么就只好退而求其次,将6763个字分割成为几块,分块处理,也没什么别的,就是麻烦点。 具体方法 1. 启动PS,将现有字体按照需要排列在一起,位图化。注意:1,字与字之间留有足够的空隙,以免在分割字符的时候相互影响。 2,字要足够大,一般应当在10cm10cm以上,否则矢量化的时候,精密程度会受影响。 2. 按照事先的设想,对每一个字的位图笔画进行分层划分,一层一种笔画。例如1层,丶;2层,一;3层,丨;4层,丿;5层…….汉字所有不同的笔画加在一起,大概在40~50之间,应当不会超过255个,PS最多能够接受255层,满足一般的设计要求应当没有问题。

点阵字库的生产原理

点阵字库 ?·点阵字库的生产原理 点阵字库的概述 ?·在DOS程序中使用点阵字库的... ?·点阵字库和矢量字库的差别 ?·如何使用Windows的系统字库... ?·Unicode中文点阵字库的生成... 点阵字库的应用 ?·标准点阵字库芯片 ?·标准点阵字库芯片的种类和应用 ?·51单片机的13×14点阵缩码汉卡 ?·标准点阵汉字字库芯片 点阵字库的生产原理 所有的汉字或者英文都是下面的原理, 由左至右,每8个点占用一个字节,最后不足8个字节的占用一个字节,而且从最高位向最低位排列。 生成的字库说明:(以12×12例子) 一个汉字占用字节数:12÷8=1····4也就是占用了2×12=24个字节。 编码排序A0A0→A0FE A1A0→A2FE依次排列。 以12×12字库的“我”为例:“我”的编码为CED2,所以在汉字排在CEH-AOH=2EH区的D2H-A0H=32H个。 所以在12×12字库的起始位置就是[{FE-A0}*2EH+32H]*24=104976开始的24个字节就是我的点阵模。 其他的类推即可。 英文点阵也是如此推理。 在DOS程序中使用点阵字库的方法 首先需要理解的是点阵字库是一个数据文件,在这个数据文件里面保存了所有文字的点阵数据.至于什么是点阵,我想我不讲大家都知道的,使用过"文曲星"之类的电子辞典吧,那个的液晶显示器上面显示的汉子就能够明显的看出"点阵"的痕迹.在 PC 机上也是如此,文字也是由点阵来组成了,不同的是,PC机显示器的显示分辨率更高,高到了我们肉眼无法区分的地步,因此"点阵"的痕迹也就不那么明显了. 点阵、矩阵、位图这三个概念在本质上是有联系的,从某种程度上来讲,这三个就是同义词.点阵从本质上讲就是单色位图,他使用一个比特来表示一个点,如果这个比特为0,表示某个位置没有点,如果为1表示某个位置有点.矩阵和位图有着密不可分的联系,矩阵其实是位图的数学抽象,是一个二维的阵列.位图就是

相关主题