各位大虾:小弟近来正在研究truetype技术和矢量字库的技术原理及实现的程序源代码,可是苦于没有相关资料及相应指导,请大虾指点相关的书籍,网站或相关资料,也请高手留名,大家共同研究,送分不是问题.小弟刚刚接触这个领域,请大家多多指教!!!

解决方案 »

  1.   

    ...                广泛汉字矢量字库(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);
    }
      

  2.   

    到Linux中找一个名为chpower的软件的源代码,里面有如何读取ttf字库的函数,我曾经看过,但没有认真研究。在Linux中的其它软件也会有关于ttf字库的内容,多找找吧!Good Luck!!!
      

  3.   

    这几天有事,对不起各位热心的大侠啦。小弟真的是很笨,误以为矢量字库就是truetype技术,其实不是的!!所以我的问题要修正一下:各位大虾:小弟近来正在研究truetype技术及实现的程序源代码,可是苦于没有相关资料及相应指导,请大虾指点相关的书籍,网站或相关资料,也请高手留名,大家共同研究,送分不是问题.小弟刚刚接触这个领域,请大家多多指教!!!但我还是真心感谢one_add_one,呵呵,会给你分的~!!请大家多多指教!!!!!!!!
      

  4.   

    多谢大家支持~!希望感兴趣的同仁一起努力亚~!!!!
    truetype技术也叫字体轮廓技术,是apple与microsoft一起开发的,谁有中文资料呀!!!!!!!!!!求救~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
      

  5.   

    to one_add_one:你好,我用了你给的代码,把字库文件改成了\winnt\fonts下的一个字库文件(这是字库文件吗?),编译运行没有错误,可是输入区位之后不写字阿,有时是几个直线,有时是点)请问这是怎么回事啊?谢谢!还有,您能提供一些这方面的资料或者网站吗?不胜感激!
      

  6.   

    to one_add_one:能不能将你在程序中引用的字库发给我![email protected]