2024年3月26日发(作者:)

.

5.2 BMP文件格式

BMP文件格式是Microsoft Windows下最常见的图像文件格式之一,它采用位映射存储

格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。

BMP文件的图像深度可选lbit、4bit、8bit与24bit。BMP文件存储数据时,图像的像素值在

文件中的存放顺序为从左到右,从下到上,也就是说,在BMP文件中首先存放的是图像的

最后一行像素,最后才存储图像的第一行像素,但对与同一行的像素,则是按照先左边后右

边的的顺序存储的;另外一个需要关注的细节是:文件存储图像的每一行像素值时,如果存

储该行像素值所占的字节数为4的倍数,则正常存储,否则,需要在后端补0,凑足4的倍

数。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows

环境中运行的图形图像软件都支持BMP图像格式。

典型的BMP图像文件由四部分组成:

1、位图头文件数据结构

主要包含文件的大小、文件类型、图像数据偏离文件头的长度等信息;

2、位图信息数据结构

包含图象的尺寸信息、图像用几个比特数值来表示一个像素、图像是否压缩、图像所用

的颜色数等信息;

3、调色板

包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板,但如果图像为

真彩色,既图像的每个像素用24个比特来表示,文件中就没有这一块信息,也就不需要操

作调色板。

4、位图数据

记录了位图的每一个像素值或该对应像素的颜色表的索引值,图像记录顺序是在扫描行

内是从左到右, 扫描行之间是从下到上。这种格式我们又称为Bottom_Up位图,当然与之相

对的还有Up_Down形式的位图,它的记录顺序是从上到下的,对于这种形式的位图,也不

存在压缩形式。

5.2.2 BMP文件结构

位图文件〔bitmap file, BMP〕格式是Windows采用的图像文件存储格式,在Windows

环境下运行的所有图像处理软件都支持这种格式。 Windows3.0以后的BMP格式与显示设

备无关,因此把这种BMP格式称为设备无关位图〔Device Independentbit Bitmap , DIB〕格

式, Windows能够在任何类型的显示设备上显示BMP位图。BMP位图默认的文件扩展名

是bmp。

1、文件结构

位图文件可看成由4个部分组成:位图文件头〔Bitmap-File〕、位图信息头

〔Bitmap-Information Header〕、彩色表〔Color Table〕和定义位图的字节阵列,它们的名称

. .

.

和符号如下表1所示:

表1 BMP图像文件组成部分的名称和符号

位图文件的组成

位图文件头

位图信息头

彩色表

图像数据阵列字节

结构名称

BITMAPEILEHEADER

BITMAPINFOHEADER

RGBQUAD

BITMAPDATA

符号

bmfh

bmib

aColors [ ]

aBitmapBits [ ]

2、位图文件结构可综合在下表中:

表2 位图文件结构

偏移量 名称 大小〔byte〕 内容

两字节的内容用来识别位的类型:

000Ah

002h

006h

File Size

Reserved

Bitmap Data

Offset

4

4

4

000h 标识符 2 BM——Windows 3.x,9x,NT,……

CI、CP、IC、PT——OS/2

用字节表示的整个文件的大小

保留,设置为0

从文件开始到位图数据开始之间的数据〔Bitmap

Data〕的偏移量

位图信息头的长度,用来描述位图的颜色和压缩

000Eh

Bitmap Header

Size

4

方法等。下面的长度表示:

28 h——Windows3.X ,9X,NT…

0Ch/F0h——OS/2 1.x

0012h

0016h

001Ah

001Eh Compression 4

Width

Height

Planes

4

4

2

位图的宽度,以像素为单位

位图的高度,以像素为单位

位图的位面数

每个像素的位数

001Ch Bites Per Pixel 2 1—单色位图;4—16色图;8—256色位图

16—16bit 高彩位图;24—24位真彩位图

压缩说明:

0:无压缩;

1—RLE 8-bit/pixel〔BI_RLE4〕

2—RLE 4-bit/pixel〔BI——RLE8〕

3—Bitfields〔BI_BITFIELDS〕

0022h

0026h

002Ah

002Eh

Bitmap Data Size

Hresolution

Vresolution

Colors

4

4

4

4

. .

用字节数表示的位图数据的大小。

该数必须是4的倍数。

用pixel/m表示的水平分辨率

用pixel/m表示的水平分辨率

位图使用的颜色数。如8bit/pixel表示为100h或

.

者256

0032h Important Colors 4

指定重要的颜色数。当该域的值等于颜色数时,

表示所有颜色都一样重要

调色板规X。对于调色板中的每个表项,这4个

字节用下述方法来描述RGB的值:

0036h Palette N*4

·1字节用于表示RGB中的蓝色分量

·1字节用于表示RGB中的绿色分量

·1字节用于表示RGB中的红色分量

·1字节用于表示填充符〔设置为0〕

该域的大小取决于压缩方法它包含所有的位图

0436h Bitmap Data X

数据字节,这些数据字节实际就是彩色调节器色

板的索引号

3、结构详解

〔1〕位图文件头:它包含有关于文件类型、文件大小和存放位置等信息,在Windows

3.0以上版本的位图文件中用BITMSPFILEHEADER结构体来定义。位图文件头包含了图像

类型、图像大小、图像数据存放地址和两个保留未使用的字段。BMP文件头数据结构含有

BMP文件的类型、文件大小和位图起始位置等信息。

其结构定义如下:

typedefstructtagBITMAPFILEHEADER{

WORDbfType; // 位图文件的类型,必须为BM

DWORD bfSize; // 位图文件的大小,以字节为单位

WORD bfReserved1; // 位图文件保留字,必须为0

WORD bfReserved2; // 位图文件保留字,必须为0

DWORD bfOffBits; // 位图数据的起始位置,以相对于位图

//每个像素所需的位数,必须是 1( 双色), 4(16 色),8(256 色)或24(真彩色)

// 文件头的偏移量表示,以字节为单位

} BITMAPFILEHEADER; //该结构占据14个字节。

〔2〕位图信息头:位图信息用BITMAPINFO结构体来定义,位图信息头包含了位图

信息头的大小、图像的宽高、图像的色深、压缩说明图像数据的大小和其他一些参数。

BMP位图信息头数据用于说明位图的尺寸等信息。

typedefstructtagBITMAPINFOHEADER{

DWORD biSize; // 本结构所占用字节数

LONGbiWidth; // 位图的宽度,以像素为单位

LONGbiHeight; // 位图的高度,以像素为单位

WORD biPlanes; // 目标设备的级别,必须为1

WORD biBitCount// 每个像素所需的位数,必须是1(双色) (黑白二色图),

// 4(16色),8(256色)或24(真彩色)之一 (新的.bmp格式支持32位色)

DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),

// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

. .

.

DWORD biSizeImage; // 位图的大小,以字节为单位

LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数

LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数

DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数

DWORD biClrImportant;// 位图显示过程中重要的颜色数

} BITMAPINFOHEADER; //该结构占据40个字节

它由位图信息头和彩色表组成,前者用BITMAPINFOHEADER结构体定义,后者用

RGBQUAD结构体定义。

1〕彩色表的定位:应用程序进行彩色表的定位时,可使用存储在biSize成员中的信息

来查找在BITMAPINFO结构体中的彩色表。

2〕biBitCount:biBitCount=1表示位图最多有两种颜色,黑色和白色。图像数据阵列中

的每一位表示一个pixel:biBiCount=4表示位图最多有16种颜色。每个像素用场bit表示,

交用这4bit作为彩色表的表项来查找该像素的颜色。

3〕ClrUsed:BITMAPINFOHEADER结构中的成员ClrUsed指定实际使用的颜色数目。

4〕8bit/pixel的图像数据压缩:

BI_RLE8 8bit/pixel的RLE压缩编码,可使用编码方式和绝对方式中的任何一种进行压

缩,这两种方式可在同一幅图中的任何地方使用。

编码方式由此与彼个字节组成,第一个字节指定使用相同颜色的像素数目,第二个字节

指字使用的颜色索引。此外,这个字节对中的第一个字节可设置为0,联合使用第二个字节

的值表示:

 第二个字节的值为0 行的结束

 第二个字节的值为1 图像结束

 第二个字节的值为2 其后的两个字节表示下一个像素从当前开始的水平和垂直位

置的偏移量

绝对方式第一个字节设置为0,而第二个字节设置为03h~0FFh之间的一个值。在这种

方式中,第二个字节表示跟在这个字节后面的字节数,每个字节包含单个像素的颜色索引。

5〕每个像素为4位的图像数据压缩:

BI_RLE4 每个像素为4位的RLE压缩编码,同样也可使用编码方式和绝对方式中的任

何一种进行压缩,这两种方式也可在同一幅图中的任何地方使用。

编码方式由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引。

绝对方式这个字节对中的第一个字节设置为0,第二个字节包含有颜色索引数,其后续

字节包含有颜色索引,颜色索引存放在该字节的高、低4位中,一个颜色索引对应一个像素。

BI_RLE4也同样联合使用第二个字节中的值表示:

 第二个字节的值为0 行的结束

 第二个字节的值为1 图像结束

 第二个字节的值为2 其后的两个字节表示下一个像素从当前开始的水平和垂直位

置的偏移量

〔3〕彩色表:包含的元素与位图所具有的颜色数相同,像素的颜色用RGBQUAD结构

来定义。彩色表中的颜色按颜色的重要性排序,这可辅助显示驱动程序为不能显示足够多颜

色数的显示设备显示彩色图像。

. .

.

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型

的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedefstructtagRGBQUAD{

BYTE rgbBlue;// 蓝色的亮度(值X围为0-255)

BYTE rgbGreen; // 绿色的亮度(值X围为0-255)

BYTE rgbRed; // 红色的亮度(值X围为0-255)

BYTE rgbReserved;// 保留,必须为0

} RGBQUAD;

彩色表/调色板〔color table〕是单色、16色和256色图像文件所特有的,相对应的调色

板大小是2、16和256,调色板以4字节为单位,每4个字节存放一个颜色值,图像的数据

是指向调色板的索引。可以将调色板想象成一个数组,每个数组元素的大小为4字节,假设

有一256色的BMP图像的调色板数据为:

调色板[0]=黑、调色板[1]=白、调色板[2]=红、调色板[3]=蓝…调色板[255]=黄

图像数据01 00 02 FF表示调用调色板[1]、调色板[0]、调色板[2]和调色板[255]中的数据

来显示图像颜色。每个调色板的大小为4字节,按蓝、绿、红存储一个颜色值。

〔4〕位图数据:紧跟在彩色表之后的是图像数据字节阵列。图像的每一扫描行由表示

图像像素的连续的字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽

度。

位图的一个像素值所占的字节数:当biBitCount=1时,8个像素占1个字节;当

biBitCount=4时,2个像素占1个字节;当biBitCount=8 时,1个像素占1个字节;当

biBitCount=24时,1个像素占3个字节,此时图像为真彩色图像。当图像不是为真彩色时,

图像文件中包含颜色表,位图的数据表示对应像素点在颜色表中相应的索引值,当为真彩色

时,每一个像素用三个字节表示图像相应像素点彩色值,每个字节分别对应R、G、B分量

的值,这时候图像文件中没有颜色表。上面我已经讲过了,Windows规定图像文件中一个扫

描行所占的字节数必须是4的倍数(即以字为单位),不足的以0填充,图像文件中一个扫描行

所占的字节数计算方法:

DataSizePerLine= (biWidth* biBitCount+31)/8;// 一个扫描行所占的字节数

位图数据的大小按下式计算(不压缩情况下):

DataSize= DataSizePerLine* biHeight。

. .