字体基本知识工作报告(2009-02-11 12:38:25)
标签:杂谈
工作任务:
1、学习字体、字形、字体大小、相关知识
2、学习Word对字体的处理,了解控制字体的主要参数
3、学习AutoCAD, CorelDraw中对字体的处理,全面了解各软件对字体的描述、控制
4、总结字体相关知识,为实现字体的全面描述、表达、精确控制做准备
内容提要:
计算机里面常用的字体有点阵字体与矢量字体,它们存储的信息是不相同的。本阶段工作主要研究了字体在计算机里面的表示方法,点阵字体与轮廓字体信息的提取,基于MFC GDI工具的字体处理以及一些应用程序如CorelDraw与AutoCAD对字体处理的方法。
主要内容:
一.字体基础知识
字体的概念是在印刷业中最早提出的。随着计算机技术的发展,出现电子出版技术,从而逐步形成了相应的字体技术。字体技术的发展经历了三个阶段:(1)点阵字体;
(2)矢量字体;(3)曲线轮廓字体。其中曲线轮廓字体包括两种类型,一种为 PostScript字体,此字体主要用于打印,另一种为TrueType字体和Open Type字体。
TrueType是Apple公司和 Microsoft公司合作开发的页面描述语言(Page Description Language,PDL)TrueImage中的字形描述部分。TrueType字体(简称 TTF)采用直线和二次Bezier曲线来描述字符的轮廓,结合了光栅技术和矢量技术的优点,克服了以往所有点阵字体、矢量字体和向量轮廓字体的缺点,字体可以任意放大、缩小、旋转和变形而不会影响输出质量,提供了真正的设备无关性。二次Bezier曲线既能保证轮廓曲线的光滑性,又有利于提高字形还原速度。另外,TrueType所特有的丰富的指令集,不仅弥补了TTF的二次曲线描述轮廓的不足,而且增强了TTF字形描述的灵活性。若要提高字体的质量,不仅可以通过数据信息来实现,而且可通过增加指令来进行。
OpenType字体从文件结构来说,确切地讲它是TrueType 格式的扩展延伸,它在继承了TrueType格式的基础上增加了对PostScript字型数据的支持,所以Open Type的字型数据即可以采用 TrueType的字型描述方式也可以采用PostScript的字型描述方式,这完全由字体厂商来选择决定。从文件结构的角度来讲Open Type或许并不是一种真正新的字体格式,但是该字体格式所增加的排版特性却从功能上为用户开辟了新的用字方式,为用户提供了更高效率的排版模式。
TrueType字体与OpenType字体的文件结构,都有比较规范的结构以便于应用程序提取字体信息并进行处理。
计算机要对字符进行处理要对字符进行编码,常用的字符编码方式有如下几种:
ASCII:码由一个字节中的7位(bit)表示,范围是0x00 - 0x7F 共128个字符,后来人们发现用7位不能表示所需要的所有字符,所以用一个字节的全8位字符,称之为扩展ASCII码。 GB2312-80: 是指我国19xx年公布的“中华人民共和国国家标准信息交换汉字编码”, 用连续的两个字节来表示一个字;
Unicode: 为满足不同国家对编码的需求而制定,是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求,又称Unicode(统一码、万国码、单一码)。
二.点阵字体字模的提取方法
点阵字体的字模信息是按字符编码进行存储的,要提取计算机中字体的字模信息, 还需要了解另外两种汉字编码还有机内码,区位码:
区位码:将GB 2312—80的全部字符集组成一个94×94的方阵,每一行称为一个“区”,编号为01~94,称“区码”;每一列称为一个“位”,编号为01~94,称“位码”,这样得到GB 2312—80的区位图,用区位图的位置来表示的汉字编码,称为区位码,用两们十进制数表示。
机内码:为了避免ASCII码和国标码同时使用时产生二义性问题,大部分汉字系统都采用将国标码每个字节高位置1作为汉字机内码。这样既解决了汉字机内码与西文机内码之间的二义性,又使汉字机内码与国标码具有极简单的对应关系。
国标码,机内码,区位码有如下对应关系:
区位码(十进制)的两个字节分别转换为十六进制后加20H得到对应的国标码;机内码是汉字交换码(国标码)两个字节的最高位分别加1,即汉字交换码(国标码)的两个字节分别加80H得到对应的机内码;区位码(十进制)的两个字节分别转换为十六进制后加A0H得到对应的机内码。也即:
国标码高字节=区码+20H
国标码低字节=位码+20H
机内码高字节=国标码高字节+80H=区码+A0H
机内码高字节=国标码低字节+80H=位码+A0H
汉字点阵字模代码是按照区位码的顺序在汉字库中存放的,而区位码与计算机内部使用的机内码有一一对应的关系,从而可以根据机内码找到汉字字模在汉字库中的位置,并将其提取出来,其实现步骤如下:
1) 获取汉字的机内码;
2) 通过汉字的机内码推算出区位码;
3) 同区位码计算出汉字在字库中的位置;
4) 从该偏移地址中读取32字节(16*16位)或者128字节(32*32位),就是相关字符的点阵字模代码。
Visual C++编程实现:
以下一段程序从二进字点阵字库文件HZK16中按地址寻出某个汉字字符(m_InputChar)的字模代码:
Void processChinese(CString m_InputChar, )
unsigned char th = m_InputChar.GetAt(0);
unsigned char tl = m_InputChar.GetAt(1);
//开辟字库缓冲区大小,一个字节8个点
unsigned char Libbuff[POINTER_WIDTH*POINTER_HEIGHT>>3];
unsigned char VerLibbuff[POINTER_WIDTH*POINTER_HEIGHT>>3];
ULONG address;
UCHAR BitIndex;
CFile myfile;
//清空显示缓冲区
m_HorizonLib.Empty();
m_VerticalLib.Empty();
//根据汉字内码计算在文件中地址
address = ((th-0xa1)*94+(tl-0xa1))*32;
//打开字库文件
if(!myfile.Open("HZK16",CFile::typeBinary|CFile::modeReadWrite,NULL)) {
AfxMessageBox("error");
return ;
}
//读取字模缓冲区
myfile.Seek(address,CFile::begin);
myfile.Read(Libbuff,sizeof(Libbuff));
myfile.Close();
//横排----->竖排
for(int i = 0;i<sizeof(VerLibbuff);i++)
{
BitIndex = 0x01;
UINT HorizonRow;
UINT HorizonCol;
VerLibbuff[i] = 0;
//找出列号
if(i<(sizeof(VerLibbuff)>>1))
{
HorizonCol = i;
}
else
{
HorizonCol = i - (sizeof(VerLibbuff)>>1);
}
for(int j=0;j<8;j++)
{
//找出行号
if(i<(sizeof(VerLibbuff)>>1))
{
HorizonRow = j;
}
else
{
HorizonRow = j+8;
}
UCHAR temp2 = 0x80;
//找到对应位置位
if(Libbuff[HorizonRow*2+(HorizonCol>>3)]&(temp2>>(HorizonCol%8))) {
VerLibbuff[i] = VerLibbuff[i] | BitIndex;
}
BitIndex = BitIndex<<1;
}
}
//将字模显示出来
DisplayResult(Libbuff,POINTER_WIDTH,POINTER_HEIGHT); //显示横排结果
for(i=0;i<sizeof(Libbuff);i++)
{
char temp[3];
unsigned char Value = Libbuff[i];
if(((i%8)==0)&&(i!=0))
{
m_HorizonLib += "\r\n" ;
}
m_HorizonLib += " 0x" ;
if(Value<16)
{
temp[0] = '0';
itoa(Value,&temp[1],16);
}
else
{
itoa(Value,temp,16);
}
m_HorizonLib += temp;
}
//显示竖排结果
for(i=0;i<sizeof(VerLibbuff);i++)
{
char temp[3];
unsigned char Value = VerLibbuff[i];
if(((i%8)==0)&&(i!=0))
{
m_VerticalLib += "\r\n" ;
}
m_VerticalLib += " 0x" ;
if(Value<16)
{
temp[0] = '0';
itoa(Value,&temp[1],16);
}
else
{
itoa(Value,temp,16);
}
m_VerticalLib += temp;
}
附源程序(ChinaToPoint)
三.WORD对字体的处理
Microsoft Word中输入一个字,先通过输入法输入编码,然后就是要修改字的属性了,Office2007字体的属性设置有:字体名称,大小,外边框,粗体,斜体,下划线,删除线,下标,上标,颜色,背景色等。
利用MFC GDI工具可以进行Windows程序里面字体样式的设置,并且visual C++6.0内置有CFontDialog对话框可以比较方便的进行一些常规的字体设置。
查看MSDN,CFontDialog除其构造函数外,还有如下函数:
相应的对应了其可以设置字体的字体名称(FaceName),风格(Style),大小(Size),颜色(Color),磅(Weight),突出(StrikeOut),下划线(Underline),黑体(Bold),斜体(Italic)方法。
用CFont创建字体,并可以将其应用于应用程序中的字体之中,查看MSDN,CFont对象创建方法有如下几种:
如下程序是用CFont创建一种字体并显示,其中创建CFont用到CreateFont方法: void CDialogInput::setFont(void)
{
if (m_sFontFaceName.GetLength()>0)
{
m_fSetFont.Detach();
m_fSetFont.CreateFont(m_iFontSize, //字体的逻辑高度 int nHeight
0, //字体的逻辑宽度 int nWidth
0, //出口矢量与X轴的角度 int nEscapement
m_fFontAngle, //字符基线与X轴的角度 int nOrientation
FW_NORMAL, //字体磅值int nWeight
m_fFontItalic, //该值非0为斜体BYTE bItalic
m_fFontUnderLine, //非0则加下划线 BYTE bUnderline
0, //该值非0则加删除线 BYTE cStrikeOut
DEFAULT_CHARSET, //字体的字符集 BYTE nCharSet
OUT_CHARACTER_PRECIS, //输出精度BYTE nOutPrecision
CLIP_CHARACTER_PRECIS, //剪裁精度BYTE nClipPrecision
DEFAULT_QUALITY, //输出质量BYTE nQuality
DEFAULT_PITCH|FF_DONTCARE, //调距和字体族BYTE nPitchAndFamily
m_sFontFaceName); //字体的字型名LPCTSTR lpszFaceName
m_ctlDisplay.SetFont(&m_fSetFont);
}
}
附源程序(myFontView)。
四.CorelDraw、AutoCAD中字体的处理方法
CorelDraw12是当今十分流行的矢量图形处理软件,相对于位图显示主要靠的是像素,矢量图形有的显示是由里面图元的形状来定义的,即定义数个点然后将这些点连起来,所以矢量图形可以做到放大不失真。
CorelDraw显示字体是矢量字体先获得字体的轮廓,然后用曲线将这些点连起来,根据字体显示的大小,其控制点的数目也是不相同的,这样可以使存储的控制点信息与字体显示的效果达到一个比较好的平衡。
CorelDraw对字体还有以下特点:
1. 字体的轮廓与字体的填充是可以分开的,可以对任意一部分进行单独的设置。
2. 画笔功能可以自定义的做自己喜欢的字体样式,实际上,这个时候,是将字当作一个矢量图形进行编辑了,可以对其中的任意一笔做自己喜欢的处理。另外,CorelDraw集成了大量的字体,还可以有自己用的字体。
3. CorelDraw可以将字体的轮廓变换成曲线,这样,也就可以用Bezier曲线工具与形状工具编辑了。
附件中图1分别表示了这几种效果的应用,图2与图3是图1同一个部位的放大,显示效果不相同。
AutoCad2008中的字体处理方法
AutoCAD是目前微机上广泛使用的绘图平台,其上使用的汉字常常是通过形文件(.shx)来实现的,同时也支持TrueType字体处,AutoCAD与CorelDraw不相同,将其上面的字放大后可以发现,其上面的字是用点与点之间的直线连接起来的。
AutoCAD 2008中放大的字母”u”下半部分
CorelDraw与AutoCAD字体显示其实都是先从字库里面调出字体轮廓信息,然后
再用自己的方法对其进行处理,在提取字体信息之后,CorelDraw字体处理的要点在:
1. 选取控制点的数目,位置;
2. 用曲线对其进行拟合;
3. 根据曲线做其它的扩展功能。
AutoCAD字体处理的要点在:
1. 根据字体显示大小选取直线控制点的数目位置,以保证字体显示的质量;
2. 对提取到的字体拟合与后处理。
五.字体有关知识总结
本次工作报告总结了字体在计算机里面的表示方法,点阵字体与轮廓字体信息的提取, 基于MFC GDI工具的字体处理, Microsoft Word, CorelDraw与AutoCAD对字体处理的方法。自此,已经了了解了字体处理的基本流程与方法。还需要进一步了解TrueType字体文件的结构,以便进一步方便的提取字体轮廓信息。
基于此基础,可以进行字体轮廓算法提取的研究,其它应用程序如CorelDraw与AutoCAD字体轮廓的提取以便对这些文件中字体的格式的支持.
六.参考资料
1. 百度百科,机内码国标码区位码,/view/486220.htm,2006.9.16;
2. 利用VC++实现汉字字模提取与小汉字库的生成,北方交通大学,王保华,单片机与嵌入式系统应用,2002.1,P40-41;
3. 字模提取源代码,常传文,/, 2006.5.26;
4. TrueType文件格式初探,吕强,史磊,杨季文,计算机研究与发展,19xx年第32卷11期,苏州工业大学计算机工程系,P23-31;
5. 字形技术及Open Type字体文件格式研究,肖明,胡金柱,赵慧,华中师范大学计算科学技术系,中文信息学报,19xx年第13卷第6期,P53-60;
6. TrueType字体技术的研究分析与应用,吴海辉,樊庆林,王虎,电脑知识与技术交流,20xx年 第1卷第03期。