文件格式标准:BMP gaunthan Posted on May 28 2016 ? File Format ? ## 简述 **BMP**(Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB)。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选1位、4位、8位及24位等。BMP文件存储数据时,图像的扫描方式是按**从左到右**、**从下到上**的顺序。 ## 数据结构(大端模式) 典型的BMP图像文件由四部分组成: 1. 位图文件头 包含BMP图形文件的类型、显示内容等信息。 2. 位图信息头 包含BMP图形的宽、高、压缩方法,以及定义颜色等信息。 3. 颜色表 **可选**部分,16、24、32位深的图形没有该成分。 4. 位图数据 这部分的内容根据BMP位图使用的位数不同而不同,在24位图(3字节分别存储B、G、R信息)中直接使用RGB,而其他小于24位的使用调色板中颜色索引值。 ### 位图文件头(14字节) BMP文件头数据结构含有BMP文件的类型、大小和位图起始位置等信息。其结构定义如下: ```cpp /** * @brief 位图文件头 */ typedef struct tagBITMAPFILEHEADER { WORD bfType; /* 位图文件的类型(1-2字节),必须为"BM",即0x424D*/ DWORD bfSize; /* 位图文件的大小(3-6字节),以字节为单位*/ WORD bfReserved1; /* 位图文件保留字(7-8字节),必须为0*/ WORD bfReserved2; /* 位图文件保留字(9-10字节),必须为0*/ DWORD bfOffBits; /* 位图数据的起始位置(11-14字节),以相对于位图文件头的偏移量表示,以字节为单位 */ }BITMAPFILEHEADER; ``` ### 位图信息头(40字节) BMP位图信息头数据用于说明位图的尺寸等信息。其结构定义如下: ```cpp /** * @brief 位图信息头 */ typedef struct tagBITMAPINFOHEADER { DWORD biSize; //本结构所占用字节数,值为0x 28 00 00 00(15-18字节) LONG biWidth; //位图的宽度,以像素为单位(19-22字节) LONG biHeight; //位图的高度,以像素为单位(23-26字节) WORD biPlanes; //目标设备的级别,必须为0x 01 00(27-28字节) WORD biBitCount; //每个像素所需的位数,必须是1(双色),4(16色), //8(256色)16(高彩色)或24(真彩色)之一(29-30字节) DWORD biCompression; //位图压缩类型,必须是0(不压缩),1(BI_RLE8压缩类型) //或2(BI_RLE4压缩类型)之一(31-34字节) DWORD biSizeImage; //位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节) LONG biXPelsPerMeter; //位图水平分辨率,每米像素数(39-42字节) LONG biYPelsPerMeter; //位图垂直分辨率,每米像素数(43-46字节) DWORD biClrUsed; //位图实际使用的颜色表中的颜色数(47-50字节) DWORD biClrImportant; //位图显示过程中重要的颜色数(51-54字节) }BITMAPINFOHEADER; ``` ### 颜色表 颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下: ``` /** * @brief 颜色表 */ typedef struct tagRGBQUAD{ BYTErgb Blue; //蓝色的亮度(值范围为0-255) BYTErgb Green; //绿色的亮度(值范围为0-255) BYTErgb Red; //红色的亮度(值范围为0-255) BYTErgb Reserved; //保留,必须为0 }RGBQUAD; ``` 颜色表中RGBQUAD结构数据的个数有biBitCount来确定: * 当`biBitCount=1,4,8`时,分别有2,16,256个表项; * 当`biBitCount=24`时,没有颜色表项。 位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下 ``` /** * @brief 位图信息,由位图信息头和颜色表组成。 */ typedef struct tagBITMAPINFO{ BITMAPINFOHEADER bmiHeader; //位图信息头 RGBQUAD bmiColors[1]; //颜色表 }BITMAPINFO; ``` ### 位图数据 位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描列之间是从下到上。位图的一个像素值所占的字节数: * 当`biBitCount = 1`时,8个像素占1个字节; * 当`biBitCount = 4`时,2个像素占1个字节; * 当`biBitCount = 8`时,1个像素占1个字节; * 当`biBitCount = 24`时,1个像素占3个字节,按顺序分别为B,G,R; Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充, `biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8) * bi.biHeight;` 赏 Wechat Pay Alipay 文件格式标准:AVI 串口蓝牙模块