ASCII字符點陣字庫的製做和使用

開發環境:

Win7,Eclipse,MinGW字體

 

一、生成ASCII字符文件

ASCII編碼的可打印字符是0x20~0x7E,先用運行下面這段代碼,生成一個包含所有可打印字符的txt文件:編碼

 

[cpp]  view plain  copy
 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3.   
  4. int main(int argc,char *argv[])  
  5. {  
  6.     FILE * fp;  
  7.     unsigned char i = 0;  
  8.   
  9.     fp = fopen("ascii.txt","w");  
  10.     if(fp == 0)  
  11.     {  
  12.         perror("open");  
  13.         return -1;  
  14.     }  
  15.     for(i=0x20;i<0x7F;i++)  
  16.     {  
  17.         fputc(i,fp);  
  18.     }  
  19.   
  20.     return 0;  
  21. }  

 

運行後,用記事本打開ascii.txt文件,會看到以下文本:spa

 

二、生成字模數據

使用字模提取V2.1軟件,設置字體爲宋體、12,縱向取模,字節倒序(即高位在下)。這些設置能夠根據實際狀況設置。用C51格式生成字模,大小是8*16,每一個字符用16個字節表示。如字符A的顯示以下:.net

 

取模數據爲:指針

0x00,0x00,0xC0,0x38,0xE0,0x00,0x00,0x00,0x20,0x3C,0x23,0x02,0x02,0x27,0x38,0x20,blog

而後將全部的字模數據複製到一個文本文件,刪除其中的空行,換行,註釋等與字模數據無關的內容,並將文件最後的一個逗號改成ASCII字符的句號,獲得一個純字模數據文件ascii_zk.txtip

 

三、將字模數據文件轉換爲二進制文件

將ascii_zk.txt文件中的每一個字模數據轉換爲佔一個字節的數,將全部的數據填充爲一個二進制文件ascii_zk.bin。這樣,按照ASCII碼的順序,ascii_zk.bin中每16個字節就能夠繪製一個字符。文件轉換的程序以下:ci

 

[cpp]  view plain  copy
 
  1. #include <stdio.h>  
  2. #include <stdlib.h>  
  3. /* 
  4.  *將一個ascii字符轉換爲數 
  5.  */  
  6. unsigned char c2x(char ch)  
  7. {  
  8.     unsigned char temp=0;  
  9.     if(ch>=0x30 && ch<=0x39)  
  10.         temp = ch-0x30;  
  11.     else if(ch>=0x41 && ch<=0x46)  
  12.         temp = 0x0a+(ch-0x41);  
  13.     else if(ch>=0x61 && ch<=0x66)  
  14.         temp = 0x0a+(ch-0x61);  
  15.     else  
  16.         temp =0xff;  
  17.     return temp;  
  18. }  
  19. //將ascii_zk.txt轉換爲二進制文件  
  20. int main(void)  
  21. {  
  22.     char buffer[5];  
  23.     unsigned char ch=0;  
  24.   
  25.     int i=0;  
  26.   
  27.     FILE *frp=0;  
  28.     FILE *fwp=0;  
  29.   
  30.     for(i=0; i<5; i++)  
  31.         buffer[i] = 0;  
  32.   
  33.     frp=fopen("ascii_zk.txt","r");  
  34.     fwp=fopen("ascii_zk.bin","w");  
  35.   
  36.     while(buffer[4] != 0x2e) //所有數據以句號結尾  
  37.     {  
  38.         for(i=0; i<5; i++)  
  39.             buffer[i]=fgetc(frp);  
  40.         ch = c2x(buffer[2]);  
  41.         ch = ch*16;  
  42.         ch = ch+c2x(buffer[3]);  
  43.   
  44.         fputc(ch,fwp);  
  45.   
  46.     }  
  47.   
  48.     fclose(frp);  
  49.     fclose(fwp);  
  50.   
  51.     return 0;  
  52. }  

 

字庫文件製做完畢。開發

 

四、字庫文件ascii_zk.bin的使用

ascii_zk.bin文件從ASCII碼的空格(0x20)開始,每16個字節表示一個字符的點陣字模。以字母A爲例,它的ASCII碼是0x41,那麼,它的字模數據的開始位置就是:get

(0x41-0x20)*16

從這個位置開始依次讀取16個字節,就是字母A的字模數據,將其顯示便可。

例:用Linux的終端模擬顯示點陣字符,終端屏幕中的每一個字符位置就是一個點,程序以下。

 

[cpp]  view plain  copy
 
  1. #include <stdio.h>  
  2. #include <unistd.h>  
  3. #include <curses.h>  
  4.   
  5. #define START 0x20  
  6. #define DATANUM 0x10  
  7.   
  8. int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y);  
  9.   
  10. int main(void)  
  11. {  
  12.     FILE* fp=0;  
  13.   
  14.     int i = 0;  
  15.     const char * teststring="I love Julia";  
  16.   
  17.     fp=fopen("ascii_zk.bin","r");  
  18.   
  19.   
  20.     initscr();  
  21.   
  22.     for(i=0;(teststring[i]!=0);i++)  
  23.     {  
  24.         displaychar(fp,teststring[i],'*',0+(i*8),0);  
  25.     }  
  26.   
  27.     refresh();  
  28.   
  29.     while(1);  
  30.   
  31.     endwin();  
  32.     fclose(fp);  
  33.     return 0;  
  34. }  
  35.   
  36. /* 
  37.  * 以點陣方式顯示一個ASCII字符 
  38.  * dispch是要顯示的字符,fillch是填充點陣的字符 
  39.  * start_x,start_y是顯示的起始座標 
  40.  */  
  41.   
  42. int displaychar(FILE *fp,char dispch,char fillch,char start_x,char start_y)  
  43. {  
  44.     int location = ((dispch-START) * DATANUM);  
  45.     char x=start_x;  
  46.     char y=start_y;  
  47.   
  48.     int i=0;  
  49.     int j=0;  
  50.     char buf=0;  
  51.   
  52.     //將文件流指針移到到dispch字符點陣數據的起始位置  
  53.     fseek(fp,location,SEEK_SET);  
  54.   
  55.     for(i=0;i<DATANUM;i++)  
  56.     {  
  57.         buf = fgetc(fp);  
  58.   
  59.         //顯示一個字節  
  60.         for(j=0;j<8;j++)  
  61.         {  
  62.             move(y+j,x);  
  63.             if(buf & (0x01<<j))  
  64.                 addch(fillch);  
  65.         }  
  66.   
  67.         if(x == (start_x+7))  
  68.         {  
  69.             x = start_x;  
  70.             y = (start_y+8);  
  71.         }  
  72.         else  
  73.         {  
  74.             x++;  
  75.         }  
  76.     }  
  77.   
  78.     return 0;  
  79. }  

 

該程序在Fedora12的終端中運行,效果以下:

 

 

下載:

ASCII點陣字庫文件

相關文章
相關標籤/搜索