字库转位图--
h
zk16的介紹以及簡單的使用方法
gb2312編碼表,也就是內容:http://www.knowsky.com/resource/gb2312tbl.htm
參考:
http://www.jdgcs.org/kb/HZK16
google : c語言 圖片 漢字
freetype2 庫的使用
HZK16字庫是符合GB2312標準的16×16點陣字庫,HZK16的GB2312-80支持的漢字有6763個,符號682個。其中一級漢字有3755個,按聲序排列,二級漢字有3008個,按偏旁部首排列。我們在一些應用場合根本用不到這么多漢字字模,所以在應用時就可以只提取部分字體作為己用。
HZK16字庫里的16×16漢字一共需要256個點來顯示,也就是說需要32個字節才能達到顯示一個普通漢字的目的。
我們知道一個GB2312漢字是由兩個字節編碼的,范圍為A1A1~FEFE。A1-A9為符號區,B0到F7為漢字區。每一個區有94個字符(注意:這只是編碼的許可范圍,不一定都有字型對應,比如符號區就有很多編碼空白區域)。下面以漢字“我”為例,介紹如何在HZK16文件中找到它對應的32個字節的字模數據。
前面說到一個漢字占兩個字節,這兩個中前一個字節為該漢字的區號,后一個字節為該字的位號。其中,每個區記錄94個漢字,位號為該字在該區中的位置。所以要找到“我”在hzk16庫中的位置就必須得到它的區碼和位碼。(為了區別使用了區碼和區號,其實是一個東西,別被我誤導了)
區碼:區號(漢字的第一個字節)-0xa0??? (因為漢字編碼是從0xa0區開始的,所以文件最前面就是從0xa0區開始,要算出相對區碼)
位碼:位號(漢字的第二個字節)-0xa0
這樣我們就可以得到漢字在HZK16中的絕對偏移位置:
offset=(94*(區碼-1)+(位碼-1))*32
注解:1、區碼減1是因為數組是以0為開始而區號位號是以1為開始的
??????????? 2、(94*(區號-1)+位號-1)是一個漢字字模占用的字節數
?????????? 3、最后乘以32是因為漢字庫文應從該位置起的32字節信息記錄該字的字模信息(前面提到一個漢字要有32個字節顯示)
有了偏移地址就可以從HZK16中讀取漢字編碼了,剩下的就是文件操作了,就不說了,要看代碼可以到我的文章:“hzk16漢字庫的簡單讀寫程序?”看一下,是一個最簡單的c語言程序。
hzk16漢字庫的簡單讀寫程序??
#include<stdio.h> #include<unistd.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<stdlib.h> #include<errno.h> #include<string.h>
int main() { int i,j,k; unsigned char incode[3]="齊"; //incode[0]=0xb4; //incode[1]=0xf3; unsigned char qh,wh; unsigned long offset; printf("The Font Code is %#x,%#x\n",incode[0],incode[1]); qh=incode[0] - 0xa0;? wh=incode[1] - 0xa0; offset = (94*(qh-1)+(wh-1))*32;
FILE ? ?*HZK; char ? ?*mat=(char *)malloc(32); memset(mat,0,32); if((HZK=fopen("HZK16","rb"))==NULL) { printf("Can't ? ?Open ? ?hzk16\n"); exit(0); } fseek(HZK,offset,SEEK_SET); fread(mat,32,1,HZK);
for(j=0;j<16;j++) { for(i=0;i<2;i++)? { for(k=0;k<8;k++) { if(((mat[j*2+i]>>(7-k)) & 0x1) != 0) { printf("x"); } else { printf(" "); } } } printf("\n");
} fclose(HZK);
return 0; }
c語言實現圖片插入漢字
#include <iostream>
#include <stdlib.h>
/*
part one,14 bit
*/
struct head
{
??? int bfType;????????? //位圖類型?
??? long int bfsize;???? //位圖文件大小
??? int freserved1;???? //必須為0
??? int freserved2;???? //必須為0
??? long int bfoffbits; //第54個開始
}bmp_head;
/*
part,two, 40 bit
*/
struct info
{
??? long int bisize;??????? //本結構站用的字節數 40
??? long biwidth;?????????? //位圖的寬度
??? long biheight;????????? //位圖的高度
??? int biplanes;?????????? //目標設備的級別
??? int BIBITCOUNT;???????? //每個象素所需的位數
??? long int bigcompression;//位圖壓縮類型
??? long int bisizeimage;?? //位圖的大小
??? long bixpelspermeter;
??? long biypelspermeter;
??? long int biclrused;?
??? long int biclrimportant;
}bmp_info;
using namespace std;
//unsigned char meng[30]={""};?
//unsigned char kai[30]={""};
unsigned char data[8][40]={""};
unsigned int cnt=0;
int arry_length = 8;
unsigned char buf[50]={""};
/*
??? 讀入文件????
*/
void read(char* txt)
{
??? FILE *fp;
??? //int i_1,j_1;
??? //int i_2,j_2;
??? int x[10]={};
??? int y[10]={};
????
??? if(( fp = fopen(txt,"rb")) = NULL)
??? {
??????? perror("Input file open error");
??????? exit(1);
??? }
??? else
??? {
??????? fp = fopen(txt,"rb");
??? }
???
??? for(int i=0 ;i<cnt/2 ;i++)
??? {
??????? x[i] = buf[2*i] - 0xa0;??????? //計算第一個字的區碼?
??????? y[i] = buf[2*i+1] - 0xa0;??????? //計算第一個字的位碼
??????? fseek(fp,(94*(x[i]-1)+(y[i]-1))*32,0);??? //把指針移到HZK中目標字的偏移位?
??????? fread(data[i],32,1,fp);??????????????????? //讀取數據?
??? }
????????
??? //rewind(fp);???????????????????????????? //指針回到啟始的位置?
????
??? fclose(fp);
}
/*
??? 從文件中讀取想要轉化的文字?
*/?
void readfile(char* txt)
{
??? FILE *fp;
??? char ch;
????
??? if(( fp = fopen(txt,"rb")) = NULL)
??? {
??????? perror("Input file open error");
??????? exit(1);
??? }
??? else
??? {
??????? fp = fopen(txt,"rb");
??? }
??? while(!feof(fp))
??? {????
??????? ch=fgetc(fp);
??????? cnt++;
??? }??????
??? cnt=(cnt-1);?
??? fseek(fp,0,0);
??? fread(buf,cnt,1,fp);?
????
??? fclose(fp);
}
/*
??? 把取得的16進制的編碼進行轉換,并打引出來?
*/?
void insert(long bmp_infosize,unsigned char* buff)
{?
??? int s;
??? int *x;???????????????????????? //x數組用來存放比較的結果?
??? s = bmp_infosize-1;
??? x = (int*)malloc(sizeof(int)*arry_length);?
??? char y[40] = {""};
??? int offset_1 = 0;
??? int offset_2 = 0;
??? int offset_3 = 0;
for(int time=0 ;time<cnt/2 ;time++)
{
??? for(int k=1 ;k<32 ;k++)
??? {
??????? int iMask = 1;?????????????????? //iMask是比較的數據?
??????? for(int i = 0; i<8; i++)????
??????? {
??????????? x[i] = data[time][(k-1)] & iMask;??????? //進行或運算?
??????????? iMask = iMask<<1;????????????? //把比較位向左移?
??????? }
????????????
??????? for(int i=7 ;i>=0 ;i--)
??????? {????
??????????? if( x[i] == 0 )
??????????? {
??????????????? printf(" ");
??????????? }
??????????? else
??????????? {
??????????????? buff[s-3*320+(7-i)*3-offset_1+offset_2+offset_3] = 0x00;
??????????????? buff[s-3*320+(7-i)*3+1-offset_1+offset_2+offset_3] = 0x00;
??????????????? buff[s-3*320+(7-i)*3+2-offset_1+offset_2+offset_3] = 0x00;????
??????????????? buff[s-3*320+(7-i)*3+3-offset_1+offset_2+offset_3] = 0x00;
????????????????????
??????????????????? printf("* ");
??????????? }????
??????? }
??????? if(k%2 == 0)
??????? {
??????????? printf("\n");
??????????? offset_1 = offset_1+320*3;
??????????? offset_2=0;
??????? }
??????? else
??????? {
??????????? offset_2 = 7*3;
??????? }????????
??? }???
//offset_3+=3*16;?
}
offset_3+=3*16;?
}
int main(int argc, char *argv[])
{
??? readfile("in.txt");?
??? read("HZK16");
????
??? FILE *fp;
??? const int bitcount = 3;
??? int x1,y1,x2,y2;
??? long bmp_size,bmp_infosize,size;
??? unsigned char *temp,*buff;
??? int offset=0;
????????
??? if(( fp = fopen("7.bmp","rb")) = NULL)??? //open a picture
??? {
??????? perror("Input file open error");
??????? exit(1);
??? }
??? else
??? {
??????? fp = fopen("7.bmp","a+");
??? }
??? fread( &bmp_head ,14 ,1 ,fp );
??? fread( &bmp_info ,40 ,1 ,fp );
??? x1=0,y1=0,x2=320,y2=240;
????????
??? bmp_infosize = (x2-x1+3)/4*4*(y2-y1)*bitcount;
??? bmp_size = bmp_infosize+54;
????
??? bmp_head.bfsize = bmp_size;
??? bmp_info.biwidth = (x2-x1+3)/4*4;
??? bmp_info.biheight = y2-y1;
??? bmp_info.bisizeimage = bmp_infosize;
????
??? size=bmp_size;
??? temp = (unsigned char*)malloc((size-54)*sizeof(char));?? //read information
??? fread( temp ,size-54 ,1 ,fp );
?????
??? buff = (unsigned char*)malloc( bmp_infosize * sizeof(int) );?
????????
??? fseek(fp,54,0);???????????????????
??? fseek(fp,320*bitcount*(240-y2),1);
??? for(int i=0 ;i<y2-y1 ;i++)
??? {
??????? fseek( fp ,x1*bitcount ,1 );??????? //把指針向后移動到x1?
??????? fread( &buff[i+offset] ,bmp_info.biwidth*bitcount ,1 ,fp );//讀取圖片寬度*4個長度?
??????? fseek( fp ,(320-x2)*bitcount ,1 );??????????????? //把指針向后移動到320?
??????? offset = offset+bmp_info.biwidth*bitcount-1;????? //把 offset增加 圖片寬度*4個長度?
??? }
????
??? fclose(fp);
????????
??? insert(bmp_infosize,buff);
?????????????????
??? fp = fopen("8.bmp","a+");????????? //construct a new picture
??????
??? fwrite( &bmp_head ,14 ,1 ,fp );?
??? fwrite( &bmp_info ,40 ,1 ,fp );?????
??? fwrite( buff ,bmp_infosize ,1 ,fp );
??? fclose(fp);
??? system("PAUSE");?
??? return 0;
}
總結
- 上一篇: linux 网络地址
- 下一篇: ubuntu12.04 e680 usb