其中成员wType指定TTPOLYCURVE结构所描述的曲线类型,可有两个取值;TT_PRIM_LINE和TT_PRIM_OSPLINE,分别代表曲线是折线和B样条曲线;cpfx指定数组中POINTFX结构的数目;apfx指定一个确定折线或者B样条曲线的POINTFX结构类型的数组。 字串6
POINTFX结构中包含用来描述TrueType字符字形轮廓的点的坐标,其定义为:
typedef struct tagPOINTFX { // ptfx
FIXED X;
FIXED Y;
} POINTFX,
其中X和Y分别代表点的横、纵坐标。
在调用GetGlyphOutline函数得到描述字形轮廓的数据后,要将其描绘出来还需调用绘制直线和曲线的函数。一个TrueType字符由折线和二次样条曲线描绘而成,调用GetGlyphOutline函数返回了描绘这些折线和曲线所需的点的有关信息,这些信息存储在TTPOLYGONHEADER和TTPOLYCURVE结构中,根据其中的成员wType所指定的不同值,来调用Windows API所提供的相关绘制折线和样条曲线的函数,即可绘制出字符的字形轮廓。在绘制时还可根据需要对字形轮廓进行各种处理,如放大、缩小、旋转及改变字符的纵横比等。图1显示了采用以上方法提取的“电”字的字形轮廓。
图1 “电”字的字形轮廓
还有一个需解决的问题是如何获得汉字编码的问题。通常汉字是以字符串的形式输入计算机的,要调用GetGlyphOutline函数得到某一汉字的字形轮廓,还须得到该汉字的编码(一般指GB-2312编码,在Windows NT和Windows 2000下可使用Unicode编码),用来指定GetGlyphOutline函数中的uChar参数,这就需进行由字符串到汉字编码的转换。下面给出了用Delphi实现的由汉字字符串到汉字的GB-2312编码的转换函数,该函数的输入参数为字符串的形式的单个汉字,返回值为输入参数汉字的GB-2312编码。
function CodeConvert(s:string):interger;
begin
result:=ord(WORD(s[1]shl 8)+WORD(s[2]));
end;
3 字形轮廓二值图象的转化及其编辑处理
由于受线切割机所能切割图形形状的限制,即在不重新穿丝的情况下,只能切割一笔画成的图形;加上汉字数量众多,字形千变万化,且大多数汉字都不能一笔写成,因此将汉字的字形轮廓提取出来后并不能直接用于切割,还需对其进行一定的编辑处理,使其符合线切割加工的需要,即把它变成能一笔写成的切割轨迹。且实际应用中,多数情况下可能不是切割单个汉字而需一次切割多个汉字,这也要进行编辑处理。而要进行编辑处理,首先要将图形转化为图象。还是以“电”字为例,在未经编辑处理时,在线切割机上只能切割出如图2所示的不完整字形,在经过适当的编辑处理后,线切割机就可加工出如图3所示的完整汉字的字形了。