BMP文件编码[C语言]

/ 0评 / 0

首先我们知道BMP是16色的,就是565模式,BMP的宽高定义为width和height,每个像素应该由掩码来决定,BMP数据大小就是width*height*2,所以这个初始化配置应该如下.

	bmpheadsize=sizeof(hbmp);//得到bmp文件头的大小
	mymemset((u8*)&hbmp,0,sizeof(hbmp));//置零空申请到的内存.
	hbmp.bmiHeader.biSize=sizeof(BITMAPINFOHEADER);//信息头大小
	hbmp.bmiHeader.biWidth=width;	 	//bmp的宽度
	hbmp.bmiHeader.biHeight=height; 	//bmp的高度
	hbmp.bmiHeader.biPlanes=1;	 		//恒为1
	hbmp.bmiHeader.biBitCount=16;	 	//bmp为16位色bmp
	hbmp.bmiHeader.biCompression=3;//每个象素的比特由指定的掩码决定。
 	hbmp.bmiHeader.biSizeImage=hbmp.bmiHeader.biHeight*hbmp.bmiHeader.biWidth*hbmp.bmiHeader.biBitCount/8;//bmp数据区大小

 其中头信息初始化是,数据除外的是偏移,包含数据的是文件大小.

	hbmp.bmfHeader.bfType=((uint16_t)'M'<<8)+'B';//BM格式标志
	hbmp.bmfHeader.bfSize=bmpheadsize+hbmp.bmiHeader.biSizeImage;//整个bmp的大小
   	hbmp.bmfHeader.bfOffBits=bmpheadsize;//到数据区的偏移

 565中,RGB分别是如下掩码,对于刷过TFT的,这些应该不是什么问题吧.

	hbmp.RGB_MASK[0]=0X00F800;	 		//红色掩码
	hbmp.RGB_MASK[1]=0X0007E0;	 		//绿色掩码
	hbmp.RGB_MASK[2]=0X00001F;	 		//蓝色掩码

 然后接着开始写数据,然后需要多少像素,就读取多少.我们生成BMP文件的话呢,要不就不能太大,会超过RAM,要不找个中转的位置,把数据中转过去,比如说240*320的图片,就要37.6KB,虽然F4内部RAM够,但还是觉得非常奢侈哈.另一种优化算法是,写一段时间,就停止写入,这样貌似还好一些.我用自然一些的语言表达一下:

			像素计数器=0;
 			for(;像素计数器!=BMP文件实际宽度;)
			{
				if(像素计数器

 今天时间很晚了,解码比较复杂,今天就先不说了.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注