【图像处理】 BMP 图像格式编解码(一)

一、什么是 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++】计算机视觉
  • 🌈 若有帮助,还请关注➕点赞➕收藏,不行的话我再努努力💪💪💪

其他

更多专栏订阅推荐:

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

锡兰_CC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值