字模

 點陣字模原理與讀取

 

 

  1、字模生成原理編程

漢字的點陣字模是從點陣字庫文件中提取出來的。例如經常使用的16×16點陣HZK16文件,12×12點陣HZK12文件等等,這些文件包括了GB 2312字符集中的全部漢字。如今只要弄清漢字點陣在字庫文件中的格式,就能夠按照本身的意願去顯示漢字了。數組

  下面以HZK16文件爲例,分析取得漢字點陣字模的方法。
   HZK16文件是按照GB 2312-80標準,也就是一般所說的國標碼或區位碼的標準排列的。國標碼分爲 94 個區(Section),每一個區 94 個位(Position),因此也稱爲區位碼。其中01~09 區爲符號、數字區,16~87 區爲漢字區。而 10~15 區、88~94 區是空白區域。
  如何取得漢字的區位碼呢?在計算機處理漢字和ASCII字符時,使每一個ASCII字符佔用1個字節,而一個漢字佔用兩個字節,其值稱爲漢字的內碼。其中第一個字節的值爲區號加上32(20H),第二個字節的值爲位號加上32(20H)。爲了與ASCII字符區別開,表示漢字的兩個字節的最高位都是1,也就是兩個字節的值都又加上了128(80H)。這樣,經過漢字的內碼,就能夠計算出漢字的區位碼。
  具體算式以下:
  qh=c1-32-128=c1-160 wh=c2-32-128=c2-160
  或   
  qh=c1-0xa0 wh=c2-0xa0
  qh,wh爲漢字的區號和位號,c1,c2爲漢字的第一字節和第二字節。
  根據區號和位號能夠獲得漢字字模在文件中的位置:
  location=(94*(qh-1)+(wh-1))*一個點陣字模的字節數。
  那麼一個點陣字模究竟佔用多少字節數呢?咱們來分析一下漢字字模的具體排列方式。
  例以下圖中顯示的「漢」字,使用16×16點陣。字模中每一點使用一個二進制位(Bit)表示,若是是1,則說明此處有點,如果0,則說明沒有。這樣,一個16×16點陣的漢字總共須要16*16/8=32個字節表示。字模的表示順序爲:先從左到右,再從上到下,也就是先畫左上方的8個點,再是右上方的8個點,而後是第二行左邊8個點,右邊8個點,依此類推,畫滿16×16個點。
 
對於其它點陣字庫文件,則也是使用相似的方法進行顯示。例如HZK12,可是HZK12文件的格式有些特別,若是你將它的字模看成12*12位計算的話,根本沒法正常顯示漢字。由於字庫設計者爲了使用的方便,字模每行的位數均補齊爲8的整數倍,因而實際該字庫的位長度是16*12,每一個字模大小爲24字節,雖然每行都多出了4位,但這4位都是0(不顯示),並不影響顯示效果。 還有UCDOS下的HZK24S(宋體)、HZK24K(楷體)或HZK24H(黑體)這些打印字庫文件,每一個字模佔用24*24/8=72字節,不過這類大字模漢字庫爲了打印的方便,將字模都放倒了,因此在顯示時要注意把橫縱方向顛倒過來就能夠了。
  這樣咱們就徹底清楚瞭如何獲得漢字的點陣字模,這樣就能夠在程序中隨意的顯示漢字了。

 

2、字模提取程序spa

 
若是在程序中使用的漢字數目很少,也能夠沒必要老是在程序裏帶上幾百K的字庫文件,也許你的程序才只有幾十K。這樣能夠事先將所須要顯示的漢字字模提取出來,放在另外一個文件裏,按照本身的順序讀取文件就能夠了。
  下面的程序說明了具體顯示漢字的方法,以16×16漢字爲例,使用HZK16文件。
 
在TC 2.0下運行上面程序,就在屏幕上打印出你想要顯示的漢字,例如該程序運行後會在屏幕上顯示:你好,世界!
 
程序中每次將一個漢字的點陣字模存儲於buffer[32]緩衝數組裏面,所以咱們能夠編程從該緩衝數據組裏面取出對應漢字的點陣模存儲於另的一個數組裏面,而後能夠經過PC機串口發送給單片機,最後顯示在LED點陣顯示屏上。

 

複製代碼
 1 #include<stdio.h>  2 #include<graphics.h>  3   4 /* x,y爲顯示座標,s爲顯示字符串,colour爲顏色 */  5 void hanzi16(int x,int y,char *s,int colour)  6 {  7 FILE *fp;  8 char buffer[32]; /* 32字節的字模緩衝區 ,若是是12X12,那麼是24字節(16X12=2byteX12)*/  9 register i,j,k; 10 unsigned char qh,wh; 11 unsigned long location; 12 if((fp=fopen("hzk16","rb"))==NULL) 13 { 14     printf("Can't open hzk16!"); 15     getch(); 16     exit(0); 17 } 18 while(*s) 19 { 20     qh=*s-0xa0; 21     wh=*(s+1)-0xa0; 22     location=(94*(qh-1)+(wh-1))*32L; /* 計算漢字字模在文件中的位置 */ 23     fseek(fp,location,SEEK_SET); 24     fread(buffer,1,32,fp); 25     for(i=0;i<16;i++)/*點陣行數索引*/ 26         for(j=0;j<2;j++)/*點陣左子行右子行索引*/ 27             for(k=0;k<8;k++)/*點陣每一個點*/ 28                 if(((buffer[i*2+j]>>(7-k))&0x1)!=NULL)/*遍歷當前點(i,j,k)所在字節buffer[i*2+j],via (向右移位至當前點檢查是否爲Null)*/ 29                     putpixel(x+8*j+k,y+i,colour); 30     s+=2;/* 一個漢字兩個字節,顯示下一個字節 */ 31     x+=16; /* 漢字間距 */ 32 } 33  34 fclose(fp); 35 } 36  37 main() 38 { 39     int gd=DETECT,gm; 40     initgraph(&gd,&gm,""); 41  42     hanzi16(246,200,"你好,世界!",BROWN); 43  44     getch(); 45     closegraph(); 46 }
相關文章
相關標籤/搜索