(学习笔记1)BMP位图的组成

BMP图像文件
BMP位图文件格式是Windows系统交换图像数据的一种标准图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与现实设备有关,因此把它称为设备相关位图(Device-dependent Bitmap, DDB)文件格式。Windows以后的BMP位图文件格式与显示设备无关(Device-indenpendet Bitmap, DIB)格式,目的是让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的文件扩展名为bmp。

BMP位图文件由4个部分组成:位图文件头(Bitmap-file Header)、位图信息头(Bitmap-information Header)、调色板(Palette)和像素数据(Image Data)。如下图所示:

(学习笔记1)BMP位图的组成_第1张图片

1.位图头文件
VC ++ 中用BITMAPFILEHEADER数据结构定义位图头文件,它包含文件类型、文件大小和存放位置等信息,结构如下:

typedef struct tagBITMAPFILEHEADER
{
    WORD    byType;      //说明文件的类型 
    DWORD   bfSize;      //说明文件的大小,以字节为单位 
    WORD    bfReserved1; //保留,设置为0 
    WORD    bfReserved2; //保留,设置为0 
    DWORD   bfOffBits; // 说明从BITMAPFILEHEADER结构
    //开始到实际图像数据阵列字节间的字节偏移量

}BITMAPFILEHEADER;

这个结构的长度是固定的,为14个字节,其中WORD为无符号16位二进制数,DWORD为无符号32位二进制数。

2.位图信息头
VC ++ 中用BITMAPINFOHEADER数据结构定义位图信息头,它包含位图的大小、压缩类型和颜色格式等信息,其结构定义如下:

typedef struct BITMAPINFOHEADER
{
    DWORD   biSize;        //本结构大小的字节数
    LONG    biWidth;       //位图的宽度,单位为像素点
    LONG    biHeight;      //位图的高度,单位为像素点
    WORD    biPlanes;      //目标设备位平面数,其值设置为1 1
    WORD    biBitCount;    //像素的位数(1,4,8,24)
    DWORD   biCompression; //压缩方式,0为不压缩 
    DWORD   biSizeImage;   //压缩图像大小的字节数,为压缩图像为0 
    LONG    biXpelsPerMeter;//水平分辨率(像素点每米)
    LONG    biYpelsPerMeter;//垂直分辨率(像素点每米)
    DWORD   biClrUsed;      //图像中使用的颜色数
    DWORD   biClrImportant; //重要色彩数,0表示都重要 
}BITMAPINFOHEADER;

3.调色板
VC ++ 中,调色板实际上定义为一个数组,共有biClrUsed个元素,每个元素的类型是一个RGBQUAD结构,其定义如下:

typedef struct tagRGBQUAD
{
    BYTE    rgbBlue;     //指定蓝色分量 
    BYTE    rgbGreen;    //指定绿色分量 
    BYTE    rgbRed;      //指定红色分量 
    BYTE    rgbReserved; //保留值 
}RGBQUAD; 

24位真彩色图像不使用调色板,因为位图中的RGB值就代表了每个像素的颜色,所以BITMAPINFOHEADER后直接是像素数据
4.像素数据
紧跟在调色板之后的是图像数据字节阵列,用BYTE数据结构存储。图像的每一扫描行由表死图像的连续像素字节组成,每一行的字节数取决与图像的颜色数和用像素表示的图像宽度。扫描行是由底向上存储的,这就是说,数据存放是从下到上,从左到右。从文件中最先读到的图像数据是位图最小面的左边的第一个元素,然后是左边的第二个像素,而最后读到的图像数据是位图最上面一行最右边的一个像素。

我们可以通过UltraEdit软件打开一副bmp照片。我们将要打开的照片是下面这副

(学习笔记1)BMP位图的组成_第2张图片

通过UltraEdit软件打开后我们可以看位图头文件的数据,如下图:

BITMAPFILEHEADER部分如下图:
(学习笔记1)BMP位图的组成_第3张图片

1)1:图像文件头。 424Dh = “BM”,表示是Windows支持的BMP格式。
2)2-3:整个文件大小。48AA 0A00,为000AAA48h。
3)4-5:保留,必须设置为0。
4)6-7:从头文件开始到位图数据之间的偏移量。3600 0000,为00000036h。
5)8-9:位图图信息头长度。
6)10-11:位图宽度,以像素为单位。2D02 0000,为0000022Dh。
7)12-13:位图高度,以像度为单位。A201 0000,为000001A2h。
8)14:位图的位面数,该值总是1。0100,为0001h。

BITMAPINFOHEADER:

(学习笔记1)BMP位图的组成_第4张图片
9)15:每个像素的位数。有1(单色),4(16色), 8(256色), 16(64K色,高彩色), 24(16M色,
10)真彩色),32(4096M色,增强型真彩色)。1800 0000为00000018h。
11)16-17:有压缩说明,有0(不压缩),1(RLE 8,8位RLE压缩),2(RLE 4,4位RLE压缩,3(Bitfields,位域存放))。 图中0000 0000为00000000h。
12)18-19:用字节数表示的位图数据的大小,该数必须是4的倍数,数值上等于位图宽度位图高度每个像素位数。12AA 0A00为000AAA12h。
13)20-21:用像素/米表示的水平分辨率。2700 0000为00000027h。
14)22-23:用像素/米表示的垂直分辨率。2700 0000为00000027h。
15)24-25:位图使用的颜色索引数。设为0的话,则说明使用所有调色板项。图中为0000 0000为00000000h。
16)26-27:对图像显示有重要影响的颜色索引的数目。如果是0,表示都重要。图中为0000 0000为00000000h。

RGBQUAD:
(学习笔记1)BMP位图的组成_第5张图片
图中列举了调色板的三个表项,可以看到分别是(3E,47,32,3E) , (47, 32, 3F, 48) , (33, 3F, 48, 33)

后面就是像素数据。下一篇博文来介绍如何读取与显示BMP照片。

你可能感兴趣的:(bmp,图像处理,位图)