位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
- 位图文件头(bitmap-file header):提供文件的格式、大小等信息,一共14字节。
- 位图信息头(bitmap-information header):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息,一共40字节。
- 调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表。
- 位图数据(bitmap data)。
一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示。除了24位图,还有1位(单色),2位(4色,CGA),4位(16色,VGA),8位(256色),16位(增强色),24位(真彩色)和32位等。
实例分析
使用WinHex打开这个文件,然后对源码进行分析。小端方式存储。
位图文件头
Windows为bmp文件头定义了如下结构体:
typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType; // 2Bytes,必须为"BM",即0x4D42才是Windows位图文件
DWORD bfSize; // 4Bytes,整个BMP文件的大小
UINT16 bfReserved1; // 2Bytes,保留,为0
UINT16 bfReserved2; // 2Bytes,保留,为0
DWORD bfOffBits; // 4Bytes,文件起始位置到图像像素数据的字节偏移量
} BITMAPFILEHEADER;
位图信息头
bmp信息头结构体定义如下:
typedef struct tagBITMAPFILEHEADER
{
DWORD biSize; // 4Bytes,指定此结构体的长度,为40
LONG biWidth; // 4Bytes,位图宽
LONG biHeight; // 4Bytes,位图高
WORD biPlanes; // 2Bytes,平面数,为1
WORD biBitCount; // 2Bytes,像素位数,1/2/4/8/16/24/32
DWORD biCompression; // 4Bytes,压缩方式,0:不压缩,1:RLE8,2:RLE4
DWORD biSizeImage; // 4Bytes,4字节对齐的图像数据大小
LONG biXPelsPerMeter; // 4 Bytes,X方向分辨率
LONG biYPelsPerMeter; // 4 Bytes,Y方向分辨率
DWORD biClrUsed; // 4 Bytes,实际调色板索引数,0:使用所有调色板索引
DWORD biClrImportant; // 4 Bytes,重要的调色板索引数,0:所有调色板索引都重要
} BITMAPINFOHEADER;
调色板
bmp调色板结构体定义如下:
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据。调色板大小为N*4(bytes),其中N表示颜色的数目。每4字节表示一种颜色,分别为B(蓝色)、G(绿色)、R(红色)、alpha。
位图数据
biBitCount计算每个像素所占的字节数。