利用C语言编程实现小型矢量汉字库的创建及调用.pdf
- 文档编号:3437622
- 上传时间:2023-05-05
- 格式:PDF
- 页数:4
- 大小:142.84KB
利用C语言编程实现小型矢量汉字库的创建及调用.pdf
《利用C语言编程实现小型矢量汉字库的创建及调用.pdf》由会员分享,可在线阅读,更多相关《利用C语言编程实现小型矢量汉字库的创建及调用.pdf(4页珍藏版)》请在冰点文库上搜索。
编程语言RoGRALANGUAGE利用C语言编程实trill|型矢量汉字库昀创建及调用西安通信学院董有积摘要本文简要介绍利用c语言编写程序,建立一个小型是量汉字库的方法关键词点阵字库,矢量字库,索引信息我们在编写图形界面应用程序时,往往在应用软件的封面要用到较大的字体做标题。
如果用点阵字库进行放大显示则会在显示字体边缘出现锯齿状,产生失真,不美观;若用高点阵的字库,速度卫太慢但改用矢量字库进行显示,效果就不同,不仅显示速度快而且字体边缘平滑无失真,同时还可任意进行无级缩放设计软件封面仅需步量的汉字为此若带一个庞大的是量字库,就太不划算本文讨论如何利用c语言编写程序创建一个小型矢量汉字库,可供应用程序调用的问题。
要建立小型矢蹙汉字库,首先必须搞清楚矢量字库的结构。
矢量汉字库与点阵汉字库不同。
点阵字库(如24点阵)汉字是由纵横各24个点组成,凡有笔划的为1,无笔划的点为0,这样一个汉字的字模可用72个字节二进制数表示,每个汉字的字模长度都相等,按其区位码顺序存放在字库中,而矢量字体并不是用点阵信息描述汉字的笔划,而是将汉字的笔划边缘用直线段描述成封闭的曲线,并将线段各端点的坐标经压缩存储,它是图形信息建库的。
由于每个汉字的笔划不一样,所以每个汉字在库中所占长度是不相同的这样,矢量字库不能象阵字库那样定位,只能采用索引的方法。
因而每种矢量字库都是由两部分组成,一部分是汉字的索引信息,它包括每个汉字的矢量数据在库中的位置地址以及汉字字形数据的长度,存放在字库的前面部分,按汉字的区位码顺序存放;另一部分是汉字的字形数据,包括控制信息和各点坐标信息,是字库的主体放在字库的后面。
如UCDOS3X的矢量字库HZJSISTJ(宋体简体)、HZKSLFSJ(仿朱简体)、HZKSLKTJ(楷体简体)、HZKSIHTJ(黑体简体),其索引信息眭度为6个字节-前面两个字节是汉字矢量数据在库中的起始位置,后两个字节为汉字字形数据的长度。
28电脑编程技巧与维护1998年第9期要进行矢量汉字显示,首先根据其机内码按下面公式:
汉字的索引信息首址一(汉字机匈码高位字节一0Xal+汉字机内码低位字节一0Xa1)6计算出其索引信息首址,然后从指定的矢量字库按索引地址连续读出6个字节的索引信息,再根据索引信息中字形数据在库中的位置及字形数据的长度从库中读出相应的字形数据,最后裤码还原得到其轮廓多边形的各点坐标,画出多边形并填充,即可得到矢量汉字了解了一般矢量汉字库的结构,不难看出,要建立一个小型矢量汉字库,小字库的结构也必须包括索引信息和矢量数据区两部分,所不同的是小型矢量汉字库的索引信息并非按汉字的区位码顺序排列,这样必然会给检索带来麻烦。
为解决此问题,就必须在小型矢量字库的索引信息中,再增加其区位码信息。
如此一来,在小型矢量字库中,每个汉字的索引信息长度为8个字节,其前两个字节为汉字的区位码,接着的四个字节是字形数据在库中的位置,后两个字节为汉字字形数据的长度。
比较一下原来矢量字库的索引信息表结构是lypedefstruclunsignedIongoddr;,字形数据的地址*unsignedintsiZe;,*字形数据的长度*,。
SlP;而小型矢量字库的索引信皂表结构应为typedefstructcunsignedint0wm,*汉字的区位码*unsLgnedlongaddr;*字形数据的地址*ugnedtn【sze,*字嘭数据的长度,sire建立小型矢量汉字库,首先将要显示的汉字用文字处理软件(WPS的N方式或ccED)编成文本文件维普资讯http:
/P编撰语言_HZTxT,注意取掉重复的汉字然后根据HZTxT文件确定小字库存放汉字的个数,后面程序中的字符常量MAx定义为32,就可存放32个汉字。
由于每个汉字的索引信息为8个字节,小型矢量字库的索引信息区长度为256字节,矢量数据区将从字库第257字节处开始存放第一个汉字的矢量数据。
若要增加存放汉字的数量,只需修改符号常量MAx的数值最后用c语言编写程序,编程的思路是这样的:
首先根据运行程序所带的参数打开相应的矢量字库,如果没带参数,则程序终止并提示操作方法;如果要打开的矢量字库不存在,同样显示提示信息并退出。
接着打开文本文件HZTxT和小矢量字库文件XSLHZK,从文本文件HZTxT读取第一个汉字的内码,换算出它的区位码,写入小矢量字库的索引信息结构中。
再根据其内码计算出它在原矢量字库索引信息中的首址,从中读出6个字节的索引信息,然后根据索引信息中的地址及长度,在原矢量字库中读出相应的矢量数据,将其写入小型矢量字库中的矢量数据区。
而小字库索引信息中的地址应等于MAx*8,索引信息中的长度等于原矢量字库索引信息中的字形数据长度,将这两项数据写入小字库的索引信甚中。
接着读取第二个汉字的内码,其操作同前,但第二个汉字索引信息的地址应等于第一个汉字的地址加上第一个汉字的字形数据的长度,如此循环直到文本文件结束为止根据以上思路编写出程序xs】ZKC,在TurboC20集成环境下进行编译,生成XSLZKEXE文件,运行XSLZKEXE就可建立小矢量汉字库XSLHZK。
运行XSLZKExE程序必须在C盘uCDOS子目录下有”HzKSLSTJ、HzKSLFSJ、HZKSI,KTJ”、”HZKSLHTJ”矢量字库。
该程序运行格式如下:
XSLZK回车其中:
S表示生成宋体小型矢量汉字库;F表示生成仿宋体小型矢量汉字库;K表示生成楷体小型矢量汉字库;H表示生成黑体小型矢量汉字库。
四者必须选择其中一种。
如果要建立以上四种以外的字体如隶字体,则必须在UCDOS子目录下有其相应的矢量字库文件,并把程序中相应的语句稍作修改即可小型矢量汉字库建立以后,可由XSIHZKYSC编译链接生成演示程序,该程序运行就调用小型汉字库,首先根据要显示的汉字区位码,在打开的小型矢量字库的索引信息中寻找,找到后根据其提供的地址、长度信息在矢量数据区读出相应的矢量数据,然后解码还原,得到其轮廓多边形各顶点的坐标,用fillpoly()函数画出多边形并填充,即可显示矢量汉字xslzkc创建小型矢量汉字库源程序#Inolude”stdlo#defineMAX32typedefstructunsignedlongaddrunsignedin1size;sip:
typedefslructunsignedin1owrfl:
unsignedlongaddrunsgnedintsize:
sire;voidquit(void;main(intargc,char*argv)unsignedcharch,n2slPhi1slmzMAX-:
lntitk,0mtwmiIongrscFILE*fp,*fp1,texlfpif(argcf=2)err:
printf、nUsage:
xslzkn”t叫ntf(”、门s:
STf:
FSkKTh:
HT)6,xlt
(1)islrcpy(n,argvt:
)istrupr【n);ch=nO;swltch(ch)caseS:
if(fp=open(c:
ucdoshzkslsti“”rb)=NULL)qui1(】breakcaseF:
if(fp=foben(”clucdoshzkslfsl,”rb)一=NULL)qL1()breakcageK:
if(晒一open(”c:
ucdoshzkslkq,rb)=一NULL)qui()IbreakIcaseH:
if“fpfopen(c:
ucdoshzkslhti,rb)=NULL)quit();break;default:
galaerr;|f(f01一openxslhzkwb”)一=NULL)fprint1(13Can1openwritefile!
):
exi1
(1);一if(textfp=fopen(”hztxl,rb)一一NULL)、prinlf(毋Can、1openhzfxlfileI_|1exit
(1):
kfilelength(filen0(textfD)2Iforioi一k)电脑缩程技巧与维护1998年第9期29峙_可_维普资讯http:
/P缡程语言R0GRAMLANGUAGEzjqwm=0z门addr0;z门size=0eIseqrr:
(1ge1c(fextfp)一OxoO)8-Ox7fwm=tfgetc(textf0)一Oxa0)B0xf;zjdwm=qm*lOOwm;rec=(qrr一16)94一wm1fseek(fp,(1ong)rec*6SFKSET);fread(髫nI51fp);Ijsize=hisizeti=一0)zr0aadr一8MAXel,ejoadrz1addrz1:
slzefvrite(1_8,1,fp1)iprntf(dxxz门qwmz门addr,zll:
size)seek(IexI1000)1Ie(IecI(iexgp)drrt1ge1textfp、一Oxao)60x7tiwp3一(1gelc(1extfp)一tlxao)蛐7f:
rec一(cm16)*g4一wm一1:
1seek“0(ong)rec*6SEEKSET)lredfhfp);fseeK(fphIodorSEEKSET);or(i:
;ihIsIzei+)chfgetc(fp;0u。
:
cn1p1)pnntf-slhzkPlOdeok!
”IosealI(t;pnntcCanfopenhzkslJfile。
l_。
Jet1);XSLHZKYSC1、型矢量慢字库J亚用示倒源程序*,inciudesc0Ioh#iqcude0raDhicshqeiliMAX32ypedefstruct-JnsignedInlqwm;,JnslgnedlongaddruI:
s;gnedns2e:
nzMAX一:
TIdIrqIgrLJJodoJIslhziqlsxinlsyirllWW,intwhintwdirRco,一Lqsgnedchars:
Icheekhz(unsignedin!
c)Im口lin,lgr30电脑缛程技巧与维护1998年第9期setcolorLIGHrGRAY);setfiIIstyle11t;bar3d(0,06394791O);outslhz(Z254040401013”高等院校)outslhz(8010060,Bo014学生成绩管理系统”)outslhz(2l04003333,5,11”西安通信学院)IgetchIosegraph();voIdoutslhz(jntsx,Incsy,Intww,In1whintwd,Intcounsignedchar*s)FILEfpiunsignedcharqm-wm:
charchEl024iunsignedIntreln1mx,mytdx-dyk,xyLz56amntnum=q;【n1x0一yO,x1Y1i一flagcotJxsys;lntg,lflog0xO=s;v0一syIfor(k=oiK256;k+xyk=0ilp=fopentxshzk“,rb;If(fp一一NULL)closegroDh()IprintlConfopenxslhzk。
);ext(0j;fseektlpO,SEEKSET)foF(c一0tMAX卜+)1read(I=f3,】fp);whiie(*s):
qm一(sOxa0)80x7flwm一(s+1)一0xaO)Ox?
freqm*】00+wm;achcekhz(re);fseek(fptzigoddr,0);faro=0;IzEqsizeI+jchi=getc(t口):
0k=osetcolor(co);IOl(I=o【zqsize;)switch(chi:
)曲xc0)CaSe0xc0:
If(flag一1)setlillslyle(1,co)fiIlpolvpoinlnum,xy);for(k=o;k256k+)xyEk一o;palntnum=0kodx=(ch-i0x31)7)dvchEil&Oxrf;xs=dxys=dyx0=sx+Kswwg6;y0=sv+yswh6;xylh一x0ik+;xyk=y0ik4-4-;-4-:
2:
poJntnum4-十flag=1Ibreak;case0x8,3:
rrx=mV一1;swiICh(ch门)x30)cQse0Xa3;If(chimo8)mx=一hdxch-iOx07;if(chi4-l&OxeO)mv一一】;维普资讯http:
/缟程语言ROGRAMLAGUAGE勰dy=chi+】8,Dx7f;l+一2:
eak:
case帆10:
if(chjgZ,xOg)my=】;dy=chi&oxo7;ll(chD+1&OxSO)mx一一1;dx=chi+18,OxTf;l+一2tbreak:
cOseOx2O:
ociseOx3O:
lI(chi+1&ox8o)mx一一1;dx=chFi-f-1gs0xTf;li(chFi+2&Ox8O)my=1;dy=chFi4-2gs0xTf;l+=3;break;xs+=dx*mx;ys一一dymy;x1一sx+xs*ww96;ylsy+ys*wh96;xyCk=xlIk+;xy-k一y1Ik4+;ooncnum+oreok;caseOx40:
switch(chi呱so)coseOxO0:
mx=1)my=】)break;caseOx10:
mx一1)my=l;break:
c09eOx20lmx一1Imv:
一1breakIcaseOx30:
mx=1mv一一1bceak;COU=chFi&OxOf;foe(J一0;J4;dy=chD+J+】&ox0fIxs+=mxdx;ys+一mvdy;xl=s,x4-xs*ww96:
Y1一sy+yswh96xyk=xl;k+;xyEk=ylk+;pointnum4-+i一一COU一1;breakcaseOxOO:
COUchiJOxSf;f0r(J一0J4;dy=(chCi+J十】0x07);xsxsmxdx;ysys+mydy;xlsx+xsww96:
Y1=sy+ys*wh96xv卧一nk+一v1k+poincnum+4-;+=COU+1breok“polv(poinmumrxy);for(kO;k256:
k+jxyk=O;pointnum一0;kO;s+一2;sxsx+ww+wdfcJose(ip)inldvDETECT,md=o;reglslerbgldrlver(EGAVGAdriver)initgraDh(8v,d,”);inlchcekhz(unsignedinl0)unsignedintfe;for(p=0P一)rezEpcwmff(re=oJreturn(P)(收稿j期:
1998年4目13日)东方远望诚征防病毒伙伴美国网络联盟公司(NAI)凭借其出奇制胜的拳头产品网络二具(NetTools),为名美国财富杂志垒球500强80的企业提供计算机安全保障。
据IDC资料显示,NAI产品在垒球反捅毒市场占有率寿68,居领先地位。
NAI全球用户达三千万,二千童员工遍及六大洲,业务覆盖65A国家。
北京东方远望科技发展公司作为NAI中国总代理及产品授权维护中心,坚持以“适中的价格,上乘的服务赢得市场的经营理念。
NAI指定东方远望公为总代理,旨在借助东方远望公司对NAI反病毒产品四年代理约丰富经验和与经销商台作的良好声誉。
为共同推广NAI垒系巩网络管理产品(防杀病毒、信息加密、网略黑客监理、防火墙、网络匡生和帮助平台),东方远望特
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 利用 语言 编程 实现 小型 矢量 汉字库 创建 调用