/*
* ttt.cpp
*
* Created on: 2012-12-5
* Author: xy
*/



#include <stdlib.h>
#include <stdio.h>
#include <string.h>




/*
part one,14 bit
*/
#pragma pack(2) //以2個字節對齊
struct head {
short int bfType; //位圖類型
long int bfsize; //位圖檔案大小
short int freserved1; //必須為0
short int freserved2; //必須為0
long int bfoffbits; //第54個開始
} head;

 

/*
part,two, 40 bit
*/
struct info {
long int bisize; //本結構站用的字節數 40
long biwidth; //位圖的寬度
long biheight; //位圖的高度
short int biplanes; //目標設備的級別
short int BIBITCOUNT; //每個象素所需的位數
long int bigcompression; //位圖壓縮類型
long int bisizeimage; //位圖的大小
long bixpelspermeter;
long biypelspermeter;
long int biclrused;
long int biclrimportant;
} info;
#pragma pack()
void init_bmp(unsigned int bmp_width,unsigned int bmp_height)
{
info.bisize = 0x28 ;// 本結構的大小40個字節
info.biwidth = bmp_width; //位圖寬
info.biheight= bmp_height; //位圖高 要修改
info.biplanes = 0;
info.BIBITCOUNT = 32 ;// 位圖的色深 32是要字節對齊
info.bigcompression = 0 ;// 表示不壓縮
info.bixpelspermeter = bmp_width*bmp_height*4; //位圖數據
info.bixpelspermeter=0;
info.biypelspermeter=0;
info.biclrused = 0;
info.biclrimportant = 0;

 

head.bfType=0x4d42;//ASICC bm
head.bfsize = bmp_width*bmp_height*4+56; //位圖數據 + 數據頭
head.freserved1=0;
head.freserved2=0;
head.bfoffbits=0x36;//54

 

}
/*****************************************************
* 功能:讀字庫
* 參數:character 傳入字元 character_size 字元gb2312碼的個數 buf 傳出字元在字庫中的值 buf_size buf的字節數
* 補充:character傳入的字元一定要是gb2312,一定不能是utf-8的。
* **************************************************/
int read_data_from_hzk(unsigned char *buf,unsigned int buf_size, char *character,unsigned int character_size)
{
unsigned char qh,wh;//區 位
int ret;
unsigned long offset;//字庫中偏移
unsigned int i;
FILE *HZK;



if(strlen(character)/2!=character_size||buf_size/32!=character_size)//檢查是不是gb2312的碼
{
printf("the character is wrong 2 \n");
return -1;
}



for(i=0;i<character_size; i++)
{
unsigned char *p=(unsigned char *)(character+i*2); //兩個字節,也就是一個字元偏移一下
if(*p<0xa0||*(p+1)<0xa0) //檢查是不是gb2312的碼
{
printf("the character is wrong 1 \n");
return -1;
}
qh=p[0]- 0xa0;;
wh=p[1]- 0xa0;;
offset = (94*(qh-1)+(wh-1))*32;



if((HZK=fopen("HZK16","r"))==Null)
{
printf("Can't Open hzk16\n");
return -1;
}
ret=fseek(HZK,offset,SEEK_SET);
if(ret<0)
{
printf("error in fseek\n");
return -1;
}
ret=fread( buf+i*32,32,1,HZK); //讀的時候,每個16*16字元點32個字節
if(ret!=1)
{
printf("error in fread,the size is %d\n",ret);
return -1;
}
}
fclose(HZK);
return 0;
}

 

/*******************************************************
* 功能:在位圖中寫字,就是把庫中讀的內容寫到位圖中
* 參數:character_buf 從字庫中讀出的字元存在的位置 character_buf_size 字元佔用的空間 p 位圖數據 p_size位圖數據佔用的空間
* bmp_width 位圖的寬 bmp_height位圖的高
*******************************************************/
void write_BMP(unsigned char *character_buf,unsigned int character_buf_size ,unsigned char *p,\
unsigned int p_size,unsigned int bmp_width,unsigned int bmp_height)
{
//fseek(fp,54,SEEK_SET);//把檔頭偏移過去
printf("characters_buf_size:%d\n",character_buf_size);
unsigned int i,j,k,size;
unsigned char *cbuf;
for(size=0;size<character_buf_size/32; size++)
{
cbuf=character_buf+size*32; //一個字元戰用32個字節
for(j=0;j<16;j++)
{
for(i=0;i<2;i++)
{
for(k=0;k<8;k++)
{
if(((cbuf[j*2+i]>>(7-k))&0x1)!=0)
{
printf("x");
//*(int *)(p+(200*(2+j)+i*8+k)*4)=0xff000000;//顯示在左,左右反的,坐標系統理解不正確
//*(int *)(p+200*18*4-(200*(2+j)+i*8+k)*4)=0xff000000;//顯示在右邊,左右反的,坐標系統理解不正確
*(int *)(p+bmp_width*(16+ (bmp_height-16)/2-1 )*4-j*bmp_width*4+i*8*4+k*4+(16*size)*4)=0xff00FF00;
//(bmp_height-16)/2-1是想放在bmp的中間位置
//指針是unsigned char ,要這樣寫,這個就可以用了, 第一個字size是0第二個字size是1 16是字庫的邊長 200是bmp的長
}
else
{
//*(p+(200*(2+j)+i*8+j)*4)=128;
printf(" ");
}
}
}
printf("\n");
}
printf("\nsize:%d\n",size);
}
}



int main()
{
unsigned int bmp_width,bmp_height; //自定義的位圖的寬和高
bmp_width = 320;
bmp_height=200;
init_bmp(bmp_width,bmp_height);

 

FILE *fp = fopen("11.bmp","w");
fwrite(&head, 1, sizeof(struct head),fp);
fwrite(&info, 1, sizeof(struct info),fp);

 

unsigned char *p= (unsigned char *)malloc(bmp_width*bmp_height*4); //分配一個bmp數據的內存
memset(p, 0xff, bmp_width*bmp_height*4); //做成白底的




unsigned char *buf;//存放從字庫中讀出來的內容
char character[]="2012-12-5 12:40:29";
unsigned int character_size=strlen(character)/2;//字庫是gb2312的,一個字占兩個字節
printf("character size:%d\n",character_size);
unsigned buf_size=character_size*32;
buf=(unsigned char *)malloc(buf_size); //一個16*16的點陣佔用32個字節
if(read_data_from_hzk(buf , buf_size, character,character_size)<0)
{
printf("read error\n");
exit(1);
}




write_BMP(buf,buf_size,p,1,bmp_width,bmp_height);

 

fwrite(p, bmp_width*bmp_height*4,1, fp);
fclose(fp);
return 0;
}






From:CSDN


創作者介紹
創作者 shadow 的頭像
shadow

資訊園

shadow 發表在 痞客邦 留言(0) 人氣()