首先我们知道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(像素计数器今天时间很晚了,解码比较复杂,今天就先不说了.