原创 BMP格式解析

2009-5-10 15:59 6110 13 14 分类: 消费电子

BMP格式解析


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


         参考文章:位图文件(BMP)格式分析以及程序实现


 


         本来应该先着手把SDRAM模块再整理包装一下,但是今天没法静心整理代码,所以就干脆趁着周末上网方便好好对BMP格式的图片数据结构做一些深入的了解。之所以先从位图(Bitmap)入手,当然是因为位图简单,更因为它是Windows显示图片的基本格式。在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图的时候才能显示出来。关于这点,做过一些液晶驱动器的特权同学还是深有体会的。不过以前做过的驱动部分大都是人家送数据过来我放到RAM里,然后每次显示从RAM搬数据这样的活,相对比较简单,没什么真正意义上的图片结构的成分,只是自己定义好了起始和结束地址就OK了。这样的数据也很容易得到,用字模或者图片取模软件转一下就可以。那么就开始好好学习一下BMP吧。


 


一、下面我们来看看位图文件(*.BMP)的格式。


位图文件主要分为如下3个部分:



块名称


对应Windows结构体定义


大小(Byte


文件信息头


BITMAPFILEHEADER


14


位图信息头


BITMAPINFOHEADER


40


RGB颜色阵列


BYTE*


由图像长宽尺寸决定


1   文件信息头BITMAPFILEHEADER


结构体定义如下:


typedef struct tagBITMAPFILEHEADER {                 /* bmfh */


UINT bfType;   


DWORD bfSize;


UINT bfReserved1;


UINT bfReserved2;


DWORD bfOffBits;


} BITMAPFILEHEADER;


其中:



bfType


说明文件的类型,该值必需是0x4D42,也就是字符'BM'


bfSize


说明该位图文件的大小,用字节为单位


bfReserved1


保留,必须设置为0


bfReserved2


保留,必须设置为0


bfOffBits


说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。


 


         看完理论不够,看看实际的Winhex里的数据是什么吧:


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />


点击看大图 


         直接找的图片的开始簇。偏移地址0-14D42H,即‘BM’;偏移地址2-500300036H,即该图片大小为十六进制的300036Byte,换算一下3M左右,和winhex里的根目录的数值是一样的;偏移地址6-78-9都是0000H;偏移地址a-d00000036H也就是说从图片开始字节地址41000H往后的偏移量为36H字节的数据才是真正的图片数据。你算一下会发现这前36H地址即存放54个字节数据正好是文件信息头(14B)和位图信息头(40B)的数据。


 


2、位图信息头BITMAPINFOHEADER


结构体定义如下:


typedef struct tagBITMAPINFOHEADER {               /* bmih */


DWORD biSize;


LONG biWidth;


LONG biHeight;


WORD biPlanes;


WORD biBitCount;


DWORD biCompression;


DWORD biSizeImage;


LONG biXPelsPerMeter;


LONG biYPelsPerMeter;


DWORD biClrUsed;


DWORD biClrImportant;


} BITMAPINFOHEADER;


其中:



biSize


说明BITMAPINFOHEADER结构所需要的字数。


biWidth


说明图象的宽度,以象素为单位。


biHeight


说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。


biPlanes


为目标设备说明位面数,其值将总是被设为1


biBitCount


说明比特数/象素,其值为1481624、或32。但是由于我们平时用到的图像绝大部分是24位和32位的,所以我们讨论这两类图像。


biCompression


说明图象数据压缩的类型,同样我们只讨论没有压缩的类型:BI_RGB


biSizeImage


说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0


biXPelsPerMeter


说明水平分辨率,用象素/米表示。


biYPelsPerMeter


说明垂直分辨率,用象素/米表示。


biClrUsed


说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)。


biClrImportant


说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。


 



点击看大图 


         再来看偏移地址0E开始的信息头的数据。偏移地址0e-11H00000028H,即BITMAPINFOHEADER结构所需要的字数为28H,具体是个什么含义就不得而知了;偏移地址12-15H00000400H(即1024),偏移地址16-19H00000300H(即768),这两个参数对应图片的像素是1024*768;偏移地址1AH-1BH0001H,即biPlanes=1;偏移地址1CH-1DH0020H,即该32bit/像素;偏移地址1eH-21H00000000H,应该是表示没有压缩的图像;偏移地址22H-25H00300000H;表示图像大小为3MB;偏移地址26H-29H00000000H,偏移地址2aH-2dH00000000H;偏移地址2eH-31H00000000H;偏移地址32H-35H00000000H


 


3RGB颜色阵列


有关RGB三色空间我想大家都很熟悉,这里我想说的是在Windows下,RGB颜色阵列存储的格式其实BGR。也就是说,对于24位的RGB位图像素数据格式是:



蓝色B


绿色G


红色R


对于32位的RGB位图像素数据格式是:



蓝色B


绿色G


红色R


透明通道A


透明通道也称Alpha通道,该值是该像素点的透明属性,取值在0(全透明)到255(不透明)之间。对于24位的图像来说,因为没有Alpha通道,故整个图像都不透明。


 


         这么看来,BPM还真是原滋原味的表现出了图片的所有数据,不带任何压缩的。


 

PARTNER CONTENT

文章评论1条评论)

登录后参与讨论

用户403664 2012-10-11 11:17

测试了一下,应该是缓存的问题啦~!现在正常了

用户1696769 2012-10-11 11:15

特权同学估计是使用了普通编辑模式粘贴WORD文档的,因此图片不能拷贝进来。要拷贝WORD里面的图片,需要使用高级编辑模式的,切记!这是一个很好用的功能啊,别浪费了。有这个功能的网站目前也不多的。

用户424277 2012-10-10 16:27

你好,图片可以正常显示

用户1000403 2012-10-9 17:40

是的,END网站太水了,后面几个图片都显示不了

用户1417837 2012-10-7 20:51

特权同学,能否还能像以前一样,你的博文弄个附件,用PDF格式的。这篇博文的后几个图片显示不了啊,END网站太水了。

ilove314_323192455 2012-8-25 13:19

等咱玩腻了也借你解解馋

用户421471 2012-8-24 09:19

Qsys初接触,CycloneII开发板,呵呵,以后也许会用Qsys

Hoki 2012-8-24 08:37

这板子确实让人垂涎啊,想当年带咱入门FPGA的也是DE2,不过是基于cycloneII版的

用户377235 2012-5-23 14:50

请问下,bmp图片数据顺序是颠倒的,FPGA怎么实现解码的啊,
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
EE直播间
更多
我要评论
1
13
关闭 站长推荐上一条 /3 下一条