分享

位图文件结构

 wfsy1983 2011-05-09
BMP的4个组成部分: 1.文件头信息块 
typedef struct tagBITMAPFILEHEADER // bmfh { WORD bfType ; // signature word "BM" or 0x4D42 DWORD bfSize ; // entire size of file WORD bfReserved1 ; // must be zero WORD bfReserved2 ; // must be zero DWORD bfOffsetBits ; // offset in file of DIB pixel bits } BITMAPFILEHEADER, * PBITMAPFILEHEADER ;



0000-0001:文件标识,为字母ASCII码“BM”。 0002-0005:文件大小。 0006-0009:保留,每字节以“00”填写。 000A-000D:记录图像数据区的起始位置。
各字节的信息依次含义为:文件头信息块大小,图像描述信息块的大小,图像颜色表的大小,保留(为01)。 2.图像描述信息块



000E-0011:图像描述信息块的大小,常为28H。 0012-0015:图像宽度。 0016-0019:图像高度。 001A-001B:图像的plane总数(恒为1)。 001C-001D:记录像素的位数,很重要的数值,图像的颜色数由该值决定。 001E-0021:数据压缩方式(数值位0:不压缩;1:8位压缩;2:4位压缩)。 0022-0025:图像区数据的大小。 0026-0029:水平每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。 002A-002D:垂直每米有多少像素,在设备无关位图(.DIB)中,每字节以00H填写。 002E-0031:此图像所用的颜色数,如值为0,表示所有颜色一样重要。 3.颜色表   颜色表的大小根据所使用的颜色模式而定:
2色图像为8字节;16色图像位64字节;256色图像为1024字节。
其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。
即首先4字节表示颜色号0的颜色,接下来表示颜色号1的颜色,依此类推。 4.图像数据区   颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,
既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。
所以,整个数据区的大小也会随之变化。
究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像素的位数)/8。 然而,未压缩的图像信息区的大小。除了真彩色模式外,其余的均大于或等于数据信息的大小。这是为什么呢?原因有两个:   1.BMP文件记录一行图像是以字节为单位的。因此,就不存在一个字节中的数据位信息表示的点在不同的两行中。
也就是说,设显示模式位16色,在每个字节分配两个点信息时,如果图像的宽度位奇数,
那么最后一个像素点的信息将独占一个字节,这个字节的后4位将没有意义。接下来的一个字节将开始记录下一行的信息。   2.为了显示的方便,除了真彩色外,其他的每中颜色模式的行字节数要用数据“00”补齐为4的整数倍。
如果显示模式为16色,当图像宽为19时,存储时每行则要补充4-(19/2+1)%4=2个字节(加1是因为里面有一个像素点要独占了一字节)。
如果显示模式为256色,当图像宽为19时,每行也要补充4-19%4=1个字节 bfType 文件标识 2bytes 0000-0001 42 4d bfSize 文件大小 1dword 0002-0005 3a 00 00 00 bfReserved1 bfReserved1 保留 1dword 0006-0009 00 00 00 00 bfOffBits 数据起始位置 1dword 000a-000d 36 00 00 00 biSize 图像信息头长度 1dword 000e-0011 28 00 00 00 biWidth 位图的宽度 1dword 0012-0015 01 00 00 00 biHeight 位图的高度 1dword 0016-0019 00 01 00 00 biPlanes 位图的位面数 1word 001A-001B 01 00 biBitCount 像素的位数 1word 001C-001D 18 00 biCompression 数据压缩方式 1dword 001E-0021 00 00 00 00 biSizeImage 图像区数据大小 1dword 0022-0025 04 00 00 00 biXPelsPerMeter 水平像素/米 1dword 0026-0029 00 00 00 00 biYPelsPerMeter 垂直像素/米 1dword 002A-002D 00 00 00 00 biClrUsed 使用的颜色数 1dword 002E-0031 00 00 00 00 biClrImportant 重要的颜色数 1dword 0032-0035 00 00 00 00 调色板规范 N*4byte 图像数据 Xbytes
构件详解 
1. 位图文件头  
位图文件头包含有关于文件类型、文件大小、存放位置等信息,在Windows 3.0以上版本的位图文件中用BITMAPFILEHEADER结构来定义:  
typedef struct tagBITMAPFILEHEADER {   
UINT bfType;
DWORD bfSize;  
UINT bfReserved1;  
UINT bfReserved2;  
DWORD bfOffBits;
} BITMAPFILEHEADER;  
其中:  

bfType
说明文件的类型.(该值必需是0x4D42,也就是字符'BM'。我们不需要判断OS/2的位图标识,这么做现在来看似乎已经没有什么意义了,而且如果要支持OS/2的位图,程序将变得很繁琐。所以,在此只建议你检察'BM'标识)  
bfSize
说明文件的大小,用字节为单位
bfReserved1
保留,必须设置为0
bfReserved2
保留,必须设置为0
bfOffBits
说明从文件头开始到实际的图象数据之间的字节的偏移量。这个参数是非常有用的,因为位图信息头和调色板的长度会根据不同情况而变化,所以你可以用这个偏移值迅速的从文件中读取到位数据。

2. 位图信息头  
位图信息用BITMAPINFO结构来定义,它由位图信息头(bitmap-information header)和彩色表(color table)组成,前者用BITMAPINFOHEADER结构定义,后者用RGBQUAD结构定义。BITMAPINFO结构具有如下形式:  
typedef struct tagBITMAPINFO {   
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;  
其中:  

bmiHeader
说明BITMAPINFOHEADER结构,其中包含了有关位图的尺寸及位格式等信息
bmiColors
说明彩色表RGBQUAD结构的阵列,其中包含索引图像的真实RGB值。

BITMAPINFOHEADER结构包含有位图文件的大小、压缩类型和颜色格式,其结构定义为:  
typedef struct tagBITMAPINFOHEADER {   
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结构所需要的字数。注:这个值并不一定是BITMAPINFOHEADER结构的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。这要根据该位图文件的格式版本来决定,不过,就现在的情况来看,绝大多数的BMP图像都是BITMAPINFOHEADER结构的(可能是后两者太新的缘故吧:-)。
biWidth
说明图象的宽度,以象素为单位
biHeight
说明图象的高度,以象素为单位。注:这个值除了用于描述图像的高度之外,它还有另一个用处,就是指明该图像是倒向的位图,还是正向的位图。如果该值是一个正数,说明图像是倒向的,如果该值是一个负数,则说明图像是正向的。大多数的BMP文件都是倒向的位图,也就是时,高度值是一个正数。(注:当高度值是一个负数时(正向图像),图像将不能被压缩(也就是说biCompression成员将不能是BI_RLE8或BI_RLE4)。  

biPlanes
为目标设备说明位面数,其值将总是被设为1
biBitCount
说明比特数/象素,其值为1、4、8、16、24、或32
biCompression
说明图象数据压缩的类型。其值可以是下述值之一:  
BI_RGB:没有压缩;  
BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引);  
BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成  
BI_BITFIELDS:每个象素的比特由指定的掩码决定。

biSizeImage
说明图象的大小,以字节为单位。当用BI_RGB格式时,可设置为0  
biXPelsPerMeter
说明水平分辨率,用象素/米表示  
biYPelsPerMeter
说明垂直分辨率,用象素/米表示  
biClrUsed
说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)  
biClrImportant
说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。

现就BITMAPINFOHEADER结构作如下说明:  
(1) 彩色表的定位  
应用程序可使用存储在biSize成员中的信息来查找在BITMAPINFO结构中的彩色表,如下所示:  
pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo->bmiHeader.biSize))  
(2) biBitCount  
biBitCount=1 表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。图像信息头装调色板中将有两个调色板项,称为索引0和索引1。图象数据阵列中的每一位表示一个象素。如果一个位是0,显示时就使用索引0的RGB值,如果位是1,则使用索引1的RGB值。  
biBitCount=4 表示位图最多有16种颜色。每个象素用4位表示,并用这4位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,它表示有两个象素,第一象素的颜色就在彩色表的第2表项中查找,而第二个象素的颜色就在彩色表的第16表项中查找。此时,调色板中缺省情况下会有16个RGB项。对应于索引0到索引15。  
biBitCount=8 表示位图最多有256种颜色。每个象素用8位表示,并用这8位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,这个象素的颜色就在彩色表的第32表项中查找。此时,缺省情况下,调色板中会有256个RGB项,对应于索引0到索引255。  
biBitCount=16 表示位图最多有216种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。  
biBitCount=24 表示位图最多有224种颜色。这种位图没有调色板(bmiColors成员尺寸为0),在位数组中,每3个字节代表一个象素,分别对应于颜色R、G、B。  
biBitCount=32 表示位图最多有232种颜色。这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32位中有24位用于存放RGB值,顺序是:最高位—保留,红8位、绿8位、蓝8位。这种格式也被成为888 32位图。如果 biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、绿、蓝分量在32位中所占的位置。在Windows 95(or 98)中,系统只接受888格式,也就是说三个掩码的值将只能是:0xFF0000、0xFF00、0xFF。而在NT系统中,你只要注意使掩码之间不产生重叠就行。(注:这种图像格式比较规整,因为它是DWORD对齐的,所以在内存中进行图像处理时可进行汇编级的代码优化(简单))。





1像素24色红色背景图片 bfType 文件标识 2bytes 0000-0001 42 4d bfSize 文件大小 1dword 0002-0005 3a 00 00 00 bfReserved1 bfReserved1 保留 1dword 0006-0009 00 00 00 00 bfOffBits 数据起始位置 1dword 000a-000d 36 00 00 00 biSize 图像信息头长度 1dword 000e-0011 28 00 00 00 biWidth 位图的宽度 1dword 0012-0015 01 00 00 00 biHeight 位图的高度 1dword 0016-0019 00 01 00 00 biPlanes 位图的位面数 1word 001A-001B 01 00 biBitCount 像素的位数 1word 001C-001D 18 00 biCompression 数据压缩方式 1dword 001E-0021 00 00 00 00 biSizeImage 图像区数据大小 1dword 0022-0025 04 00 00 00 biXPelsPerMeter 水平像素/米 1dword 0026-0029 00 00 00 00 biYPelsPerMeter 垂直像素/米 1dword 002A-002D 00 00 00 00 biClrUsed 使用的颜色数 1dword 002E-0031 00 00 00 00 biClrImportant 重要的颜色数 1dword 0032-0035 00 00 00 00 调色版规范 0byte 忽略 图像数据 3bytes 0036-0038 00 00-FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 白色1x1 42 4D 3A 00 00 00 00 00-00 00 36 00 00 00 28 00 00 00 01 00 00 00 01 00-00 00 01 00 18 00 00 00 00 00 04 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF-FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 红色1x1 42 4D 3A 00 00 00 00 00-00 00 36 00 00 00 28 00 00 00 01 00 00 00 01 00-00 00 01 00 18 00 00 00 00 00 04 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 红色2x2 42 4D 46 00 00 00 00 00-00 00 36 00 00 00 28 00 00 00 02 00 00 00 02 00-00 00 01 00 18 00 00 00 00 00 10 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-FF 00 00 FF 00 00 00 00 FF 00 00 FF 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多