BMP位图文件格式是Windows系统交换图像数据的一种标准图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows3.0以前的BMP位图文件格式与显示设备有关,因此称其为设备相关位图(DDB)文件格式。Windows3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(DIB)格式。目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的扩展名为.bmp
BMP位图文件由4部分组成:位图文件头(Bitmap-file Header)、位图信息头(Bitmap-information Header)、调色板数据(Palette Data)和像素数据(Image Data)。如图所示:
位图文件头 | |
位图信息 |
位图信息头 |
调色板数据 | |
像素数据 |
图1.1 BMP图像文件结构
1)位图头文件
Visual C++中用BITMAPFILEHEADER 数据结构定义位图头文件,它包含文件类型、文件大小和存放位置等信息,其结构如下:
typedef structtagBITMAPFILEHEADER
{
WORD bfType; /*说明文件的类型*/
DWORD bfSize; /*说明文件的大小,以字节为单位*/
WORD bfReserved1; /*保留,设置为0*/
WORD bfReserved2;/*保留,设置为0*/
DWORD bfOffBits; /*说明从BITMAPFILEHEADER结构开始到实际图像数据
阵列字节间的字节偏移量*/
}BITMAPFILEHEADER;
这个结构的长度是固定的,为14个字节,其中WORD为无符号16位二进制数,DWORD为无符号32位二进制整数。
2)位图信息头
Visual C++中用BITMAPINFOHEADER数据结构定义位图信息头,它包含位图的大小、压缩类型和颜色格式等信息,其结构如下:
typedef struct BITMAPINFOHEADER
{
DWORD biSize; /*BITMAPINFOHEADER结构所需的字节数*/
LONG biWidth; /*图像的宽度,以像素为单位*/
LONG biHeight; /*图像的高度,以像素为单位*/
WORD biPlanes; /*目标设备位平面数,其值设置为1*/
WORD biBitCount; /*每像素位数,为1、4、8或24之一*/
DWORD biCompression; /*压缩类型,0为不压缩*/
DWORD biSizeImage; /*压缩图像大小的字节数,非压缩图像为0*/
LONG biXPelsPerMeter; /*水平分辨率*/
LONG biYPelsPerMeter; /*垂直分辨率*/
DWORD biClrUsed; /*使用的色彩数*/
DWORD biClrImportant; /*重要色彩数,0表示都重要*/
}BITMAPINFOHEADER;
3)调色板
Visual C++中,调色板实际上定义为一个数组,共有biClrUsed个元素,每个元素的类型是一个RGBQUAD结构,其定义如下:
Typedef struct tagRGBQUAD
{
BYTE rgbBlue; /*指定蓝色分量(值范围为0~255)*/
BYTE rgbGreen; /*指定绿色分量(值范围为0~255)*/
BYTE rgbRed; /*指定红色分量(值范围为0~255)*/
BYTE rgbReserved; /*保留值,必须为0*/
}RGBQUAD;
对于24位真彩色图像,其不使用调色板,因为位图中的RGB值就代表了每个像素的颜色,因此BITMAPINFOHEADER后直接是像素数据。
4)像素数据
紧跟在调色板之后的图像数据字节阵列,用BYTE数据结构存储。图像的每一扫描行由表示图像的连续像素字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。扫描行是由底向上存储的,这就是说,数据存放是从下到上,从左到右。从文件中最先读到的图像数据是位图最下面的最左边的第一个像素,然后是最左边的第二个像素,而最后读到的图像数据是位图最上面一行的最右边的一个像素。