日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

制做任意大小的bmp,并在其中写汉字

發(fā)布時間:2024/9/5 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 制做任意大小的bmp,并在其中写汉字 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
/** 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個字節(jié)對齊 struct head {short int bfType; //位圖類型long int bfsize; //位圖文件大小short int freserved1; //必須為0short int freserved2; //必須為0long int bfoffbits; //第54個開始 } head;/*part,two, 40 bit*/ struct info {long int bisize; //本結構站用的字節(jié)數(shù) 40long biwidth; //位圖的寬度long biheight; //位圖的高度short int biplanes; //目標設備的級別short int BIBITCOUNT; //每個象素所需的位數(shù)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個字節(jié)info.biwidth = bmp_width; //位圖寬info.biheight= bmp_height; //位圖高 要修改info.biplanes = 0;info.BIBITCOUNT = 32 ;// 位圖的色深 32是要字節(jié)對齊info.bigcompression = 0 ;// 表示不壓縮info.bixpelspermeter = bmp_width*bmp_height*4; //位圖數(shù)據(jù)info.bixpelspermeter=0;info.biypelspermeter=0;info.biclrused = 0;info.biclrimportant = 0;head.bfType=0x4d42;//ASICC bmhead.bfsize = bmp_width*bmp_height*4+56; //位圖數(shù)據(jù) + 數(shù)據(jù)頭head.freserved1=0;head.freserved2=0;head.bfoffbits=0x36;//54} /****************************************************** 功能:讀字庫* 參數(shù):character 傳入字符 character_size 字符gb2312碼的個數(shù)  buf 傳出字符在字庫中的值  buf_size buf的字節(jié)數(shù)* 補充: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;//區(qū) 位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); //兩個字節(jié),也就是一個字符偏移一下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個字節(jié)if(ret!=1){printf("error in fread,the size is %d\n",ret);return -1;}}fclose(HZK);return 0; }/******************************************************** 功能:在位圖中寫字,就是把庫中讀的內(nèi)容寫到位圖中* 參數(shù):character_buf 從字庫中讀出的字符存在的位置  character_buf_size 字符占用的空間 p 位圖數(shù)據(jù)  p_size位圖數(shù)據(jù)占用的空間* 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; //一個字符戰(zhàn)用32個字節(jié)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;//顯示在左,左右反的,坐標系統(tǒng)理解不正確//*(int *)(p+200*18*4-(200*(2+j)+i*8+k)*4)=0xff000000;//顯示在右邊,左右反的,坐標系統(tǒng)理解不正確*(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數(shù)據(jù)的內(nèi)存memset(p, 0xff, bmp_width*bmp_height*4); //做成白底的unsigned char *buf;//存放從字庫中讀出來的內(nèi)容char character[]="2012-12-5 12:40:29";unsigned int character_size=strlen(character)/2;//字庫是gb2312的,一個字占兩個字節(jié)printf("character size:%d\n",character_size);unsigned buf_size=character_size*32;buf=(unsigned char *)malloc(buf_size); //一個16*16的點陣占用32個字節(jié)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; }


總結

以上是生活随笔為你收集整理的制做任意大小的bmp,并在其中写汉字的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。