广泛汉字矢量字库(HZKSLxxJ)格式 在矢量字库中,每个汉字都是以128 X 128点阵制成矢量数据。每个汉字 的矢量数据都由一指针指向, 指针区在每个汉字字库文件的开头0xBB3E字节。 每个汉字矢量数据指针占6个字节, 其格式为:前4个字节为汉字的矢量数据在 文件中的偏移, 后2个字节为汉字的矢量数据的长度。 汉字指针在指针区的偏移由公式计算:pos=((qu-16)*94+wei-1)*6。 注:qu--区号。wei--位号。 汉字的矢量数据格式为:控制码+坐标值。共有十种控制码,以下是控制码的 含义: (1)若控制码第7,6位为11,清除码,结束当前笔划,将第一个坐标与当前坐 标连线;建立新笔划,(X,Y)各占7位,由控制码的第5位开始,即:11XXXXXX XYYYYYYY。 注:一个字节的位: 7 6 5 4 3 2 1 0 X X X X X X X X (2)若控制码小于等于0x40,之后控制码大小个字节为坐标值,每个坐标占 一个字节, 共有控制码大小个坐标,(X,Y)坐标各占4位,其自的最高位为符号位, 即:FXXXFYYY。 (3)若控制码的高4位等于4,之后控制码的低4位大小个字节为坐标值,每个 坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为正,Y为正, 即:+XXXX+YYYY。 (4)若控制码的高4位等于5,之后控制码的低4位大小个字节为坐标值,每个 坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为负,Y为正, 即:-XXXX+YYYY。 (5)若控制码的高4位等于6,之后控制码的低4位大小个字节为坐标值,每个 坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为负,Y为负, 即:-XXXX-YYYY。 (6)若控制码的高4位等于7,之后控制码的低4位大小个字节为坐标值,每个 坐标占一个字节,共有控制码大小个坐标,(X,Y)坐标各占4位,X为正,Y为负, 即:+XXXX-YYYY。 (7)若控制码等于0x80, 其后1字节为Y坐标值, 最高位为符号位, X坐标不 变, 即: 10000000 FYYYYYYY。 (8) 若控制码等于0x90, 其后1字节为X坐标值, 最高位为符号位, Y坐标不 变,即: 10000001 FXXXXXXX。 (9) 若控制码的高4位等于8,其后1字节为Y坐标值,控制码的低4位值为X坐 标值,X坐标各占4位,最高位为符号位,Y坐标各占8位,最高位为符号位, 即:1000FXXX FYYYYYYY。 (10)若控制码的高4位等于9,其后1字节为X坐标值,控制码的低4位值为Y坐 标值,Y坐标各占4位,最高位为符号位,X坐标各占8位,最高位为符号位, 即:1000FYYY FXXXXXXX。 ------------------------------------------------------------------------- 用Turbo C 2.0编译以下程序: #include <stdio.h> #include <graphics.h> main() { unsigned long int pos; unsigned int i,j,k,len,q,w; unsigned char c,a,x=0,y=0,x1,y1,xs=0,ys=0,buffer[100]; FILE *fp; int d=DETECT,m=VGAHI; if((fp=fopen("hzkslt","rb"))==NULL) return; /* ^^^^^^汉字字库的文件名 */ printf("Input Qu :");scanf("%u",&q); printf("Input Wei:");scanf("%u",&w); printf("\n"); pos=((q-1l)*94l+w-1l)*6l; fseek(fp,pos,0); fread(&pos,4,1,fp); /* printf("%lX : ",pos);*/ fread(&len,2,1,fp); fseek(fp,pos,0); initgraph(&d,&m," "); while (len!=0) { c=getc(fp); len--; if ((c&0xf0)>=0xc0) { if (q==0) line(xs,ys,x,y); x=c; fread(&y,1,1,fp); len--; a=y; y>>=7; x=x&0x3f; x<<=1; x=x+y; y=a&0x7f; x1=x;y1=y; xs=x;ys=y; q=0; continue; } /*if ((c&0xf0)==0x00 && (c&0x0f)!=0)*/ if (c<0x40 && c!=0) { fread(buffer,1,c,fp); len-=c; for(i=0;i<c;i++) { if ((buffer[i]&0x80)==0) x1=x+(buffer[i]>>4); else x1=x-((buffer[i]&0x70)>>4); if ((buffer[i]&0x08)==0) y1=y+(buffer[i]&0x07); else y1=y-(buffer[i]&0x07); line(x,y,x1,y1); x=x1; y=y1; } continue; } if ((c&0xf0)==0x40 && (c&0x0f)!=0) { fread(buffer,1,(c&0x0f),fp); len-=(c&0x0f); for(i=0;i<(c&0x0f);i++) { x1=x+(buffer[i]>>4); y1=y+(buffer[i]&0x0f); line(x,y,x1,y1); x=x1; y=y1; } continue; } if ((c&0xf0)==0x50 && (c&0x0f)!=0) { fread(buffer,1,(c&0x0f),fp); len-=(c&0x0f); for(i=0;i<(c&0x0f);i++) { x1=x-(buffer[i]>>4); y1=y+(buffer[i]&0x0f); line(x,y,x1,y1); x=x1; y=y1; } continue; } if ((c&0xf0)==0x60 && (c&0x0f)!=0) { fread(buffer,1,(c&0x0f),fp); len-=(c&0x0f); for(i=0;i<(c&0x0f);i++) { x1=x-(buffer[i]>>4); y1=y-(buffer[i]&0x0f); line(x,y,x1,y1); x=x1; y=y1; } continue; } if ((c&0xf0)==0x70 && (c&0x0f)!=0) { fread(buffer,1,(c&0x0f),fp); len-=(c&0x0f); for(i=0;i<(c&0x0f);i++) { x1=x+(buffer[i]>>4); y1=y-(buffer[i]&0x0f); line(x,y,x1,y1); x=x1; y=y1; } continue; } if ((c&0xf0)==0x80 && (c&0x0f)==0x00) { buffer[0]=getc(fp); len--; if ((buffer[0]&0x80)==0x80) y1=y-(buffer[0]&0x7f); else y1=y+buffer[0]; line(x,y,x,y1); y=y1; continue; } if ((c&0xf0)==0x80 && (c&0x0f)!=0x00) { buffer[0]=getc(fp); len--; if ((c&0x08)==0x08) x1=x-(c&0x07); else x1=x+(c&0x07); if ((buffer[0]&0x80)==0x80) y1=y-(buffer[0]&0x7f); else y1=y+buffer[0]; line(x,y,x1,y1); x=x1; y=y1; continue; } if ((c&0xf0)==0x90 && (c&0x0f)==0x00) { buffer[0]=getc(fp); len--; if ((buffer[0]&0x80)==0x80) x1=x-(buffer[0]&0x7f); else x1=x+buffer[0]; line(x,y,x1,y); x=x1; continue; } if ((c&0xf0)==0x90 && (c&0x0f)!=0x00) { buffer[0]=getc(fp); len--; if ((buffer[0]&0x80)==0x80) x1=x-(buffer[0]&0x7f); else x1=x+buffer[0]; if ((c&0x08)==0x08) y1=y-(c&0x07); else y1=y+(c&0x07); line(x,y,x1,y1); x=x1; y=y1; continue; } if (c==0xb0) { buffer[0]=getc(fp); buffer[1]=getc(fp); len-=2; if ((buffer[0]&0x80)==0) x1=x+(buffer[0]&0x7f); else x1=x-(buffer[0]&0x7f); if ((buffer[1]&0x80)==0) y1=y+(buffer[1]&0x7f); else y1=y-(buffer[1]&0x7f); line(x,y,x1,y1); x=x1; y=y1; continue; } getch(); closegraph(); printf("<Hex:%X,Dec:%u,X=%u,Y=%u,V=%X,Vn=%X>\n",len,len,x,y,c,getc(fp)); break; } line(xs,ys,x,y); getch(); closegraph(); /*printf("--<Hex:%X,Dec:%u,X=%u,Y=%u>\n",len,len,x,y);*/ fclose(fp); } |
|