2024年6月13日发(作者:)

Bmp格式详解

更新请参见博客地址

/%C1%B5%D0%C4hjb/blog/item/

用UltraEdit打开一个24bit的bmp(对于一些头信息计算上需要注意的是,x86体系结构下是

小端模式,即数据低位在低地址),其中的二进制数据由文件头、位图信息头、颜色信息(或

称为色表、调色板等)和图形数据四部分组成。

前三个部分后续转载文中会有详细叙述,对于图形数据,有以下几个要点需要了解:

(1)Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足

的以0填充。比如7*7像素的图像,每一行原始是7*3=21字节数据,由于非4字节对齐故

会补三字节的0x00数据,使得每行为24字节数据。

(2)所有的bmp数据扫描行是上下颠倒的。也就是说一幅图片先绘制底部的像素,再绘制顶

部的像素,所以这些bmp数据所表示的像素点就是从图片的左下角开始,一直表示到图片

的右上角。

(3)Bmp数据的存储格式为BGR顺次存储。大家不能习惯性地认为是RGB顺次存储。

以下部分内容转载自/share/detail/6982516

BMP文件中文称为位图文件,实际上取自Bit Map的缩写。位图分为四种:

线画稿:只有黑白两种颜色,所以像素用0,1表示。

灰度图象:在灰度图像中,像素灰度用8bit表示,像素灰度级用8bit表示,所以每个像素

都是介于黑色和白色之间的256种 的灰度的一种。

索引图像:在真彩色出现之前,由于技术上的原因,计算机在处理时并没有达到每像素24

位的真彩色水平,为此人们创造了索引颜色。索引颜色通常也被称为映射 颜色,在这种模

式下,颜色都是预先定义的,并且可供选用的一组颜色也有限,索引颜色的图像最多只能显

示256种 颜色。一幅索引颜色图像在图像文件里定义,当打开该文件时,构成该图像具体

颜色的索引值就被读入程序里,然后根据索引值找到最终的颜色。

真彩色图像:在真彩色图像中,每一个像素由红、绿和蓝三个字节组成,每个字节为8bit,

表示0~255之间的不同的亮度值,这三个字节组合可以产生1670万种不同的颜色。

文件组成

BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

2. BMP文件头

BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

其结构定义如下:

typedef struct tagBITMAPFILEHEADER

{

WORD bfType; // 位图文件的类型,必须为BM

DWORD bfSize; // 位图文件的大小,以字节为单位

WORD bfReserved1; // 位 图文件保留字,必须为0

WORD bfReserved2; // 位 图文件保留字,必须为0

DWORD bfOffBits; // 位图数据的起始位置,以相对于位图

// 文件头的偏移量表示,以字节为单位

} BITMAPFILEHEADER;

3. 位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。

typedef struct tagBITMAPINFOHEADER{

DWORD biSize; // 本结构所占用字节数

LONG biWidth; // 位图的宽度,以像素为单位

LONG biHeight; // 位图的高度,以像素为单位

WORD biPlanes; // 目标设备的级别,必须为1

WORD biBitCount // 每个像素所需的位数,必须是1(双色),

// 4(16色),8(256色)或24(真彩色)之一

DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),

// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

DWORD biSizeImage; // 位图的大小,以字节为单位

LONG biXPelsPerMeter;// 位图水平分辨率,每米像素数

LONG biYPelsPerMeter;// 位图垂直分辨率,每米像素数

DWORD biClrUsed; // 位图实际使用的颜色表中的颜色数

DWORD biClrImportant;// 位图显示过程中重要的颜色数

} BITMAPINFOHEADER;

4. 颜色表

是单色、16色、256色图像文件所特有的,相对应的调色板大小是2、16、和256,

调色板以4字节为单位,每4个字节存放一个颜色值。图像的数据是指向调色板的索引。

颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型

的结构,定义一种颜色。RGBQUAD结构的定义如下:

typedef struct tagRGBQUAD {

BYTE rgbBlue; // 蓝色的亮度(值范围为0-255)

BYTE rgbGreen; // 绿色的亮度(值范围为0-255)

BYTE rgbRed; // 红色的亮度(值范围为0-255)

BYTE rgbReserved;// 保留,必须为0

} RGBQUAD;

颜色表中RGBQUAD结构数据的个数有biBitCount来确定:

当biBitCount=1,4,8时,分别有2,16,256个表项;

当biBitCount=24时,没有颜色表项。

位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:

typedef struct tagBITMAPINFO {

BITMAPINFOHEADER bmiHeader; // 位图信息头

RGBQUAD bmiColors[1]; // 颜色表

} BITMAPINFO;