/*
 * 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()
{
	info.bisize = 0x28 ;// 本結構的大小40個字節
	info.biwidth = 200;	//位圖寬
	info.biheight= 20;	//位圖高 要修改
	info.biplanes = 0;
	info.BIBITCOUNT = 32 ;// 位圖的色深 32是要字節對齊
	info.bigcompression = 0 ;// 表示不壓縮
	info.bixpelspermeter = 200*20*4; //位圖數據
	info.bixpelspermeter=0;
	info.biypelspermeter=0;
	info.biclrused = 0;
	info.biclrimportant = 0;

	head.bfType=0x4d42;//ASICC bm
	head.bfsize = 200*20*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位圖數據占用的空間
 *******************************************************/
void  write_BMP(unsigned char *character_buf,unsigned int character_buf_size ,unsigned char *p,unsigned int p_size)
{
	//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+200*(16+1/*1 是(20-16)/2-1 就是要把字放在格子的中間*/)*4-j*200*4+i*8*4+k*4+(16*size)*4)=0xff00FF00;
						//指針是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()
{
	init_bmp();

	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(200*20*4); //分配一個bmp數據的內存
	memset(p, 0xff, 200*20*4);								//做成白底的



	unsigned char *buf;//存放從字庫中讀出來的內容
	char character[]="你好";
	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);

	fwrite(p,1, 200*20*4,fp);
	fclose(fp);
	return 0;
}









創建一個200*20的bmp,並在bmp中寫漢字

 

From:CSDN

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

資訊園

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