24位位图存放格式说明

4位位图存放格式说明

简要说明:

BMP是一种与硬件设备无关的图像文件格式,使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit(我们这里使用24bit)。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

 

1.    24位位图结构定义

1.1  文件头结构定义

typedef struct tagBITMAPFILEHEADER{

WORD bfType; // 位图文件的类型,必须为BM(1-2字节)

DWORD bfSize; // 位图文件的大小,以字节为单位(3-6字节)

WORD bfReserved1; // 位图文件保留字,必须为0(7-8字节)

WORD bfReserved2; // 位图文件保留字,必须为0(9-10字节)

DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(11-14字节)

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

} BITMAPFILEHEADER;

 

1.2  位图信息头结构定义

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

typedef struct tagBITMAPINFOHEADER{

DWORD biSize; // 本结构所占用字节数(15-18字节)

LONG biWidth; // 位图的宽度,以像素为单位(19-22字节)

LONG biHeight; // 位图的高度,以像素为单位(23-26字节)

WORD biPlanes; // 目标设备的级别,必须为1(27-28字节)

WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(29-30字节) // 4(16色),8(256色)或24(真彩色)之一

DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),(31-34字节) // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

DWORD biSizeImage; // 位图的大小,以字节为单位(35-38字节)

LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(39-42字节)

LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(43-46字节)

DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(47-50字节)

DWORD biClrImportant;// 位图显示过程中重要的颜色数(51-54字节)

} BITMAPINFOHEADER;

 

1.3  位图数据阵列

位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占3个字节

 

2.    举例说明

从一个24位图的图片里,读出如下信息:

424D B634 1800 0000 0000 3600 0000 2800 0000 3003 0000 8802 0000 0100 1800 0000 0000 8034 1800 C40E 0000 C40E 0000 0000 0000 0000 0000 B48D 61B3 8C60

24位BMP图可分为3个部分:位图文件头、位图信息、位图阵列

2.1     文件头(14个字节)

字节 字节号

解释说明

424D 1-2 可以转换为字符‘B’、‘M’,是用于识别BMP文件的标志
B634 1800 3-6 存放的是位图文件的大小,计算得文件大小为1586358字节
0000 0000 7-10 保留字节,必须为0
3600 0000 11-14 表示位图阵列相对于文件头的偏移量,计算得54,即位图阵列从第55字节开始

2.2  位图信息(40个字节)

字节 字节号

解释说明

2800 0000 15-18 位图信息头占用的字节数,把0028转换10进制为40,即占用了40节
3003 0000 19-22 位图的宽度,以像素为单位,计算得位图的宽度为816像素
8802 0000 23-26 位图的高度,也以像素为单位,计算得位图的高度为648像素
0100 27-28 位图的平面数,必须为1
1800 29-30 代表每个像素所需要的位数,很显然我们做的是24为位图,结果为24
0000 0000 31-34 代表位图压缩类型,如果不压缩必须为0
8034 1800 35-38 位图阵列的大小,以字节为大小,计算得1586304字节
C40E 0000 39-42 位图水平分辨率
C40E 0000 43-46 位图垂直分辨率
0000 0000 47-50 位图实际使用的颜色表中的颜色数,24位不需要调色板所以设置为0
0000 0000 51-54 位图显示过程中重要的颜色数,为0表示都重要

 

2.3  位图数据阵列

从第55字节开始,每3个字节表示一个像素,这3个字节依次表示该像素的红、绿、蓝亮度分量值。