INTERACTIVE LAB

systemsVIP0 次浏览 更新于 2026-09-29

BMP图片格式详解

系统讲解“BMP图片格式详解”的核心概念、常用方法与实践要点。

前言

平时网络上有非常多类型的图片,最常见的就是png与jpg类型,但由于它们内部做了很多算法的处理、对图片数据进行了一定程度的压缩,所以并不适合一开始就拿来学习。

而本文要介绍的BMP图片,便是一种非常原始的图片格式,它将每个像素的数据都完整的保存了下来,非常适合新手学习。

BMP格式概览

BMP文件格式还是比较简单的,总共分为四部分:

  1. BITMAPFILEHEADER结构体,
  2. BITMAPINFOHEADER结构体,
  3. RGBQUAD结构体(这个结构体可以有,也可以没有),
  4. DIB数据区。(Device-Independent Bitmap,设备无关位图)。

在继续探究这些格式之前,我们还需要明白一个概念,即:RGB(Red,Green,Blue)三原色,我们图片中的像素就是用这三种颜色构成的

我们常看到的8位色,16位色,24位色和32位色这些,实际指的就是用多少位来表示一个颜色(又称位深度)

位指的是二进制的一位,一个字节(char)有8位:

image.png

以8位色为例,即一个char,可以表示的范围为:0 - 2<sup>8</sup>-1,即256种颜色,如果是1位色,那就只能表示两个颜色,即黑白图片。

目前主流的是24位色和32位色,所以这里不讨论8位数和16位色

事实上第三个结构体RGBQUAD就是为8位、16位色等较低位数准备的,使用起来也更麻烦。

本文以24位色为主。即RGB三原色,各占8位大小,即各占一个字节。

如果是32位,则RGB三原色各占8位,还剩下8位用于描述透明度的,即:rgba最后的a,Alpha透明度。

综上,我们需要了解的就只有前两个结构体,和最后的DIB数据区了。这里的结构体定义是 Windows API 的写法,不能直接假设在所有编译器、平台上都没有填充字节;实际解析文件时应按 BMP 规定的字段大小和偏移读取,并注意 BMP 使用小端序。

首先来看第一个结构体定义:

typedef struct tagBITMAPFILEHEADER {
        WORD    bfType; //图片种类,BMP图片固定为BM,表示为十六进制就是0x4d42
        DWORD   bfSize; //该图片文件的大小
        WORD    bfReserved1; //保留字,不用管
        WORD    bfReserved2;//保留字,不用管
        DWORD   bfOffBits; //实际图片数据的偏移量,即`DIB`的偏移量,也即前三个结构体的大小
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;
该实验为 VIP 专享内容,
请开通后继续阅读后续 70% 并运行完整示例~

DISCUSSION

评论 0

还没有评论,来留下第一条吧。