BMP格式详解

1. BMP格式详解

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
(1)bmp文件头(bmp file header):提供文件的格式、大小等信息
(2)位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
(3)调色板(color palette):可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
(4)位图数据(bitmap data):就是图像数据。
在这里插入图片描述

(1)bmp文件头(bmp file header) 14字节

typedef struct tagBitMapFileHeader
{
uint8_t bfType[2];					//“BM”表示位图类型
uint32_t bfSize;						//文件大小
uint16_t bfReserved1;				//必须设置为0
uint16_t bfReserved2;				//必须设置为0
uint32_t bfOffBits;					//位图数据偏移量
}BitMapFileHeader_TypeDef;

在这里插入图片描述
42 4D:表示BMP类型
0x00070836:表示文件是460854字节大小
00 00 :保留
00 00 :保留
0x00000036:表示位图数据偏移量为54

(2)位图信息头(bitmap information) 40字节

typedef struct tagBitMapInfoHeader
{
uint32_t biSize;						//位图信息头结构所需字节
uint32_t biWidth;						//图像宽度,单位为像素
int32_t biHeight;						//图像高度,单位为像素
														//正数,表示图像是倒向的,图像数据是从图像左下角到右上角排列的
														//大多数的BMP文件是倒向的位图,也就是说高度值为正数
														//负数,表示图像是正向的
uint16_t biPlanes;					//颜色平面数,设为1
uint16_t biBitCount;				//每个像素比特数,其值为1、4、8、16、24、32
uint32_t biCompression;			//图像数据压缩的类型
														//0 BI_RGB	不压缩
uint32_t biSizeImage;				//图像的大小,字节为单位,
														//单用BI_RGB格式时,可设置为0
int32_t biXPelsPerMeter;		//水平分辨率,像素/米表示,有符号整数
int32_t biYPelsPerMeter;		//垂直分辨率,像素/米表示,有符号整数
uint32_t biClrUsed;					//位图实际使用的彩色表中的颜色索引数
														//(设为0的话,则说明使用所有调色板项)
uint32_t biClrImportant;		//说明对图像显示有重要影响的颜色索引的数目
														//如果是0,表示都重要
} BitMapInfoHeader_TypeDef;

在这里插入图片描述
28 00 00 00:表示位图信息头结构为54字节
40 01 00 00:表示图像宽度为320像素
E0 01 00 00:表示图像高度为480像素,正数,图像数据是按从图像左下角到右上角排列顺序存放的
01 00:为1
18 00:表示每个像素为24bit
00 00 00 00:表示BI_RGB 图像不压缩
00 08 07 00:表示图像大小460800位
13 0B 00 00:表示水平分辨率为2835像素/米
13 0B 00 00:表示垂直分辨率为2835像素/米
00 00 00 00:表示使用所有调色板项
00 00 00 00:表示都重要

(4)位图数据(bitmap data)

24位BMP文件是,每个像素按BGR排列
例如红色,00 00 FF
绿色,00 FF 00
蓝色,FF 00 00

typedef struct tagBitMap
{
uint8_t bfType[2];					//“BM”表示位图类型
uint32_t bfSize;						//文件大小
uint16_t bfReserved1;				//必须设置为0
uint16_t bfReserved2;				//必须设置为0
uint32_t bfOffBits;					//位图数据偏移量
uint32_t biSize;						//位图信息头结构所需字节
uint32_t biWidth;						//图像宽度,单位为像素
int32_t biHeight;						//图像高度,单位为像素
														//正数,表示图像是倒向的,图像数据是从图像左下角到右上角排列的
														//大多数的BMP文件是倒向的位图,也就是说高度值为正数
														//负数,表示图像是正向的
uint16_t biPlanes;					//颜色平面数,设为1
uint16_t biBitCount;				//每个像素比特数,其值为1、4、8、16、24、32
uint32_t biCompression;			//图像数据压缩的类型
														//0 BI_RGB	不压缩
uint32_t biSizeImage;				//图像的大小,字节为单位,
														//单用BI_RGB格式时,可设置为0
int32_t biXPelsPerMeter;		//水平分辨率,像素/米表示,有符号整数
int32_t biYPelsPerMeter;		//垂直分辨率,像素/米表示,有符号整数
uint32_t biClrUsed;					//位图实际使用的彩色表中的颜色索引数
														//(设为0的话,则说明使用所有调色板项)
uint32_t biClrImportant;		//说明对图像显示有重要影响的颜色索引的数目
														//如果是0,表示都重要
} BitMap_TypeDef;	

2. 实际颜色

红色
在这里插入图片描述
绿色
在这里插入图片描述
蓝色
在这里插入图片描述


版权声明:本文为lljss1980原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。