原创 位图(BMP)文件头格式及数据分析,有了这个可以直接在单片机的LCD上显示BMP文件。

2010-2-22 18:26 4031 5 5 分类: MCU/ 嵌入式
由于BMP文件有诸多格式,这里只以256色彩色位图为例来分析一下。
这个图是我自己用画图板做的,如下。
39d445ac-045c-401d-bc98-6ad0192a9d4e.jpg
图1 BMP图
  由于这里限制上传BMP文件,所以这个是JPG的。我的原始的BMP文件大小是200*150,文件大小是31078字节,注意看属性的时候不是占用空间大小。
  在这里,我用VC编了一个程序,读入BMP文件的数据,然后分析固有的站用54个字节的文件头和信息头。
点击看大图
图2 文件头和信息头数据
  注意:图中唯一的一条竖线是文件头14个字节和信息头40个字节的分隔线。
本文章来自EDNCHINA的yoyowind的博客。http://blog.ednchina.com/yoyowind
1、BMP文件的4个部分
  BMP文件分文件头、信息头、调色板和数据区四个部分。文件头和信息头里包含一些信息,调色板顾名思义是调色的信息,数据区就是位图数据。
  这里需要注意的是,为什么会有调色板呢?调色板又该有多少数据呢?我们分析一下这个文件。256色位图是用256种颜色表示整个图片信息,也就是说数据从00~FF一共256个数代表256种颜色,而大家都知道,在计算机上,颜色是用RGB来表示的,RGB分别表示红绿蓝三种颜色的分量,必须用三个字节表示,所以数据中一个字节的信息必须经过“翻译”才能得到真正的RGB颜色,所以数据区里的数据可以理解为当前相素颜色的索引号,拿着这个索引号,去调色板里找,找到的才是对应的RGB信息。
  调色板的格式为:
typedef struct tagRGBQUAD{
  BYTE rgbBlue;
  BYTE rgbGreen;
  BYTE rgbRed;
  BYTE rgbReserved;
}RGBQUAD;
  前三个字节一看就明白了,是表示RGB信息,而最后一个字节为保留字节,不用去管。
  那么,调色板需要多少数据呢?因为256种颜色对应256个颜色索引号,每个索引号必须对应1个调色板信息,所以必须有256个调色板信息,而1个调色板信息又有4个字节,所以,调色板区站用字节一共是256*4=1024字节。也就是说,从文件开头到真正的位图数据,一共间隔14+40+1024=1078字节。
2、文件头分析
  文件头占14个字节,如图2所示。前两个字节“42 4d”表示“BM”两字,意思是这个文件是BMP文件;后面4个字节表示整个文件大小,经过计算00007966的对应十进制为31078,正好是本文件的字节数;再后面4个字节为保留字;最后4个字节为数据偏移量,也就是刚才计算的1078字节。
3、信息头分析
  前4个字节表示记录长度,也就是信息头的长度,固定为40(0x28);后面8个字节代表图片长宽信息,表示图片是200*150的;后面两个字节为1,必须是1;后面两个字节是8,表示为8位颜色,也就是256色;后面4个字节是压缩信息,这里是0000;后面4个字节00007530是200*150得到的结果,也就是总像素数;再后面的我们就不去管了。
4、用LCD和PC显示同一位图
  当然这个位图最好是灰度或者双色位图。当然调色板信息就不一样了,但是大同小异,图片大小不要超过LCD总像素数。具体编程流程是这样的。首先把文件数据发送到单片机内存,单片机编程得到数据偏移量,在数据区一一取到数据并在调色板里查到信息,将信息翻译成LCD可认格式,利用LCD的API函数逐一写像素,就可以得到图片。这个图片的显示,应该和PC上用ACDSEE等软件打开的图片一模一样。
5、图片的后处理
  当然,图片也可以进行模糊、锐化、轮廓提取、边沿检测等操作,这样就可以在单片机内编程完成而不需要VC了。我将在以后设计到这部分内容,需要的朋友请耐心等待。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
5
关闭 站长推荐上一条 /3 下一条