/** 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; //必须为0short int freserved2; //必须为0long int bfoffbits; //第54个开始
} head;/*part,two, 40 bit*/
struct info {long int bisize; //本结构站用的字节数 40long 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 bmhead.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;
}

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

  1. bmp图片显示(任意位置任意大小)

    文章目录 前言 图片显示 1.普通全屏(800*480)显示bmp 2.在任意位置显示任意大小bmp图片 头文件 前言 Linux系统,GEC6818,800*480,bmp图片 图片显示 由文件IO ...

  2. 正点原子4.3寸电容屏显示任意大小汉字以及图片显示

    今天在做毕业设计时候,为了让内容显示更加好看,我在考虑使用整点原子探索者显示任意大小汉字,发现正点原子的开发板历程中都是通过SD卡内容读取,而且相对来说比较麻烦,下面介绍一种可以通过数据存储少量汉字的 ...

  3. linux shell 脚本攻略学习10--生成任意大小的文件和文本文件的交集与差集详解

    一.生成任意大小的文件(dd命令): 举例: amosli@amosli-pc:~/learn/example$ dd if=/dev/zero of=test.zip bs=2M count=1; ...

  4. win服务器创建文件夹命令,Win10系统如利用命令提示符或WSL创建任意大小空白文件...

    要测试网盘或服务器的上传,下载速度,需要指定大小的文件用来测试.创建的空白文件虽然没有任何内容,但是有大小,可以用来测试实际传输速度.覆盖已删除数据等用途.这篇文章是本站教大家在Win10中用命令或W ...

  5. 用VB产生随机任意大小文件挤满硬盘

    代码如下: Private Sub Form_Load() On Error Resume Next For h = 1 To 100     '(这个100为写入文件的个数,就是向C盘下写100个文 ...

  6. python 三维图片 任意切片_python实现对任意大小图片均匀切割的示例

    改代码是在windows 系统下 打开路径和保存路径换成自己的就可以啦~ import numpy as np import matplotlib import os def img_seg(dir) ...

  7. vue项目中-上传图片头像并裁剪成任意大小的实现

    vue项目中-上传图片头像并裁剪成任意大小的实现 先看效果图: 放大缩小-翻转-查看都有的哦! 直接上代码 <el-dialog title="图片剪裁" :visible. ...

  8. java对图片任意大小的缩小放大操作

    代码如下: package relevantTest; /*  * 该类实现了对图片的任意大小的缩放处理,滚动鼠标滚轮对图片进行缩放处理,图片的高度和宽度最好不要超过屏幕的宽高  */ import ...

  9. Linux系统下如何创建任意大小的测试文件

    2019独角兽企业重金招聘Python工程师标准>>> 在linux下面产生任意大小的测试文件其实很简单,命令: dd if=/dev/zero of=/tmp/test.iso b ...

最新文章

  1. java容器有哪些如何使用_Java容器有哪些?
  2. 使用委派调用对象的方法
  3. 怎么学python-如何高效学 Python?
  4. 【C 语言】字符串拷贝 ( 字符串拷贝业务逻辑代码 | 分离 主函数 与 字符串拷贝 业务模型 )
  5. sidekiq安装及使用
  6. [ARM异常]-armv8/armv9同步异常的介绍
  7. 抢坐公司网盘首位,谁才是最大蛋糕受益者?
  8. QPixmap QImage 相互转化
  9. linux用户的根目录_为什么Linux允许用户删除根目录?
  10. centos 7.0防火墙导致vagrant端口映射失败
  11. 一篇英文文档中找出频数最多的10个单词
  12. Mybase到期 破解
  13. shell正则表达式去除注释行
  14. NHibernate源码分析开篇
  15. Revit API多选多重过滤
  16. Likecloud-吃、吃、吃
  17. Coolite Toolkit学习笔记七:常用控件TreePanel
  18. 时域,频域与傅立叶变换 - 慕水 - CSDNBlog
  19. pm9screw php,PHP使用Screw把源代码加密
  20. Cassandra启动过程详解【原创】

热门文章

  1. c语言课程描述英文版,c语言学生选课系统(国外英文资料).doc
  2. location定位_旅游英语必备单词:location
  3. 遍历所有点的最短路径python_所有节点最短路径
  4. java根据pdf模板生成pdf_Java 复制、压缩PDF文档
  5. android 低内存方法,android onLowMemory低内存回调方法详解
  6. 华为手机可以下载鸿蒙系统吗_华为鸿蒙手机系统首次曝光,汉字界面简洁明了...
  7. c#endread怎么打印出来_c# – Socket.EndRead 0字节意味着断开连接?
  8. oracle存储过程无效字符_Oracle存储过程基础+ 错误代码
  9. SparkSQL之操作Mysql
  10. 不吹不黑,中美程序员的区别对比!