一、什么是 BMP
1、概述
BMP是 Bitmap(位图)的简写,是 Windows 操作系统中的标准图像文件格式。BMP 采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此BMP文件所占用的空间很大。BMP 文件的图像深度可选 1bit、4bit、8bit 及 24bit,存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。BMP 位图文件默认的文件扩展名是 BMP 或者 bmp,广泛用于 Windows 操作系统中的图像存储和传输,支持多种颜色深度,但占用空间较大。
2、BMP 文件格式
BMP 文件由以下 4 部分组成
-
位图文件头(bitmap-file header)
-
位图信息头(bitmap-informationheader)
-
调色板(color table)
-
颜色点阵数据(bits data)
2.1、位图文件头
位图文件头用于描述整个 BMP 文件的情况,具体包括 BMP 文件的类型、文件大小和位图起始位置等信息,一共 14 字节。
typedef struct tagBITMAPFILEHEADER{
WORD bfType; // 位图文件的类型,必须为BMP (2个字节)
DWORD bfSize; // 位图文件的大小,以字节为单位 (4个字节)
WORD bfReserved1; // 位图文件保留字,必须为0 (2个字节)
WORD bfReserved2; // 位图文件保留字,必须为0 (2个字节)
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图 (4个字节)
} BITMAPFILEHEADER;
2.2、位图信息头
位图信息头用来描述位图的尺寸等信息,一共 40 字节。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数 (4个字节)
LONG biWidth; // 位图的宽度,以像素为单位(4个字节)
LONG biHeight; // 位图的高度,以像素为单位(4个字节)
WORD biPlanes; // 目标设备的级别,必须为1(2个字节)
WORD biBitCount; // 每个像素所需的位数,必须是1(双色)、// 4(16色)、8(256色)、
//24(真彩色)或32(增强真彩色)之一 (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;
2.3、调色板
图像的比特深度取值有 1、2、4、8、16、24、32,只有位深度小于等于 8 的图像文件才有调色板,相对应的调色板大小是 2、4、16 和 256,调色板实际上是一个数组,它所包含的元素和位图所具有的颜色数相同,数组中的每个元素的类型是一个 RGBQUAD 结构。调色板以 4 字节为单位,每 4 个字节存放一个颜色值。
typedef struct tagRGBQUAD
{
BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)
BYTE rgbGreen; // 绿色的亮度(值范围为0-255)
BYTE rgbRed; // 红色的亮度(值范围为0-255)
BYTE rgbReserved; // 保留,必须为0
} RGBQUAD;
2.4、颜色点阵数据
颜色点阵数据记录了位图的每一个像素值,按照自下向上,自左向右的顺序排列的。如果使用了调色板,那像素值就是调色板的索引值,可以根据像素值得到调色板索引值,然后根据调色板索引值找到相应的颜色,该颜色即为像素的颜色,如果用RGB值表示位图数据,那位图就没有调色板。如果 8 位深度以上的图像使用调色板,内存开销就会很大。
- 🚀 个人简介:CSDN「博客新星」TOP 10 , C/C++ 领域新星创作者
- 💟 作 者:锡兰_CC ❣️
- 📝 专 栏:【OpenCV • c++】计算机视觉
- 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪
其他:
更多专栏订阅推荐: