位图(.bmp)文件结构

bmp位图主要分为4部分,文件头、信息头、调色板(24位位图和32位位图没有调色板)、图像数据区。
文件头定义如下:

typedef struct tagBITMAPFILEHEADER 
{ 
WORD bfType; // 位图文件的类型,必须为“BM” ,16进制为0x424D。占2字节
DWORD bfSize; // 位图文件的大小,以字节为单位 ;占4字节
WORD bfReserved1; // 位图文件保留字,必须为0 ;占2字节
WORD bfReserved2; // 位图文件保留字,必须为0 ;占2字节
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图文件头的偏移量表示,以字节为
单位 ;占4字节,就是文件头+信息头+调色板总长度,即非图像数据区的长度。
} BITMAPFILEHEADER ;//该结构占据14个字节。 

信息头定义如下:

typedef struct tagBITMAPINFOHEADER{ 
DWORD biSize; // 信息头长度,此类型占4字节
LONG biWidth; // 位图的宽度,以像素为单位,占4字节
LONG biHeight; // 位图的高度,以像素为单位,占4字节
WORD biPlanes; // 目标设备的平面数不清,必须为1,占2字节
WORD biBitCount// 每个像素所需的位数,必须是 1( 双色), 4(16 色),8(256 色)或24(真彩色)
之一,占2字节
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),1(BI_RLE8 压缩类型) 或
2(BI_RLE4 压缩类型)之一,占4字节
DWORD biSizeImage; // 位图的大小,以字节为单位,占4字节
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数,占4字节
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数,占4字节
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数,占4字节
DWORD biClrImportant;// 位图显示过程中重要的颜色数,占4字节
} BITMAPINFOHEADER ;该结构占据40个字节。 

调色板有若干个表项,每一个表项是一个RGBQUAD 类型的结构,定义一种颜色。其结构定义:

typedef struct tagRGBQUAD { 
BYTErgbBlue;// 蓝色的亮度(值范围为0-255) 
BYTErgbGreen; // 绿色的亮度(值范围为0-255) 
BYTErgbRed; // 红色的亮度(值范围为0-255) 
BYTErgbReserved;// 保留,必须为0 
} RGBQUAD; //共4字节。

只有单色、16色、256色位图有调色板,24位位图(真色彩)每个像素是用三个字节表示,分别对应B(蓝)、G(绿)、R(红)三个值,文件头+信息头+调色板总长度固定为54字节。32位位图与24位的区别就是每个像素RGB值后面多了一个ALPHA通道,用来控制图片的透明度。
单色、16色、256的图像数据区中的数据不是像素值,是调色板中的颜色的映射。
数据区的第一个行像素值相当于图像的最后一行像素,用下图比较明显:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/lindorx/article/details/78756084