深入解析BMP图像文件格式:全面了解其特性和应用

更新:11-07 民间故事 我要投稿 纠错 投诉

文件结构

位图图像文件由固定大小的结构(文件头)和按预定顺序出现的可变大小的结构组成。随着文件格式的多次发展,这些结构出现了许多版本。

位图image.jpg的文件结构参考上图。位图文件由以下结构组成:

结构名称、可选大小、用途、备注、位图文件头

(位图文件头)无14字节存储位图文件一般信息仅在读取文件DIB头时有用

(DIB头)是否固定(有7个版本),存储位图详细信息和像素格式,并在位图文件头后立即附加位掩码。

(额外位掩码)是3 或4 个DWORD(12 或16 字节),定义像素格式调色板仅当DIB 标头为BITMAPINFOHEADER 并且压缩方法成员设置为BI_BITFIELDS 或BI_ALPHABITFIELDS 时才存在

(颜色表) 半可选,见注释图像数据中使用的颜色的变量定义(像素数组) 颜色深度(颜色深度) 8 填充区域A时不能省略

(Gap1) 是对齐位图文件头的变量结构中像素数组的填充像素数组偏移量。

(像素数组)是否改变像素数据的实际像素值在DIB头和附加位掩码中定义。像素阵列中的每一行都以4 字节对齐方式填充到B

(Gap2)是与DIB头中填充的ICC颜色特征数据对齐的可变结构,其偏移到ICC颜色特征数据位置。

(ICC颜色配置文件)是颜色特征的变量定义,可以包含外部文件路径,文件定义颜色特征。

一、位图文件头 Bitmap file header

这部分数据块位于文件的开头,共14个字节,用于文件标识。典型的应用程序将首先执行此数据的正常读取,以确保它确实是位图文件并且没有损坏。所有整数值都以小端顺序存储(最低有效位在前)。

偏移量

(字节数)用途0x002用于标识BMP和DIB文件,一般为0x420x4D,即ASCII BM。以下是可能的值:

BM Windows 3.1x, 95, NT,等BA OS/2 struct Bitmap ArrayCI OS/2 struct Color IconCP OS/2 const Color PointerIC OS/2 struct IconPT OS/2 Pointer0x024BMP 文件大小(以字节为单位)0x062 保留;实际值因创建程序而异0x082 保留;实际值因创建程序而异0x0a4 位图数据(像素数组)的地址偏移,即图像数据的起始地址。

二、DIB头 DIB header (bitmap information header)

这部分告诉应用程序将用于在屏幕上显示图像的图像的详细信息。它从文件的第15 个字节开始。

数据块的这一部分对应于Windows 和OS/2 以及一些其他版本变体内部使用的标头结构。但所有版本都以DWORD 位(32 位)开头来指示数据块的大小,允许应用程序根据这个大小来区分图像实际使用的是哪个版本的DIB 头结构。

之所以有多个版本的头结构,是因为微软多次扩展了DIB格式。下表显示了所有不同版本的DIB 标头:

大小结构名称操作系统支持功能作者12BITMAPCOREHEADER

OS21XBITMAPHEADEROS/2 和Windows64BITMAPCOREHEADER2 自版本3.0 起

OS22XBITMAPHEADEROS/2增加半色调屏幕;添加RLE 和Huffman 1D 压缩。 40BITMAPINFOHEADER Windows 3.0 及更高版本删除RLE-24 和Huffman 1D 压缩;添加16/32位像素格式;添加可选的RGB 位掩码。 52BITMAPV2INFOHEADERUndocumented 删除可选的RGB 位掩码;添加所需的RGB 位掩码。 Adobe Photoshop56BITMAPV3INFOHEADER 未正式记录添加所需的alpha 通道位掩码。 Adobe Photoshop108BITMAPV4HEADER Windows 95/NT4 及更高版本添加了色彩空间类型和伽玛校正。 124BITMAPV5HEADER Windows 98/2000 及更高版本添加ICC 颜色功能。 BITMAPCOREHEADER 之后的版本仅将字段附加到先前版本结构的末尾。

下面我们解释一下两个比较常见的版本。

BITMAPCOREHEADER

DIB 标头从地址0x0E 开始。下面列出了DIB 标头的BITMAPCOREHEADER 版本。除非另有说明,所有值都是无符号整数。

OffsetSize(bytes)Purpose0x0E4DIB 标头结构的大小(字节数)。对于此版本,该值为120x122 位图宽度(以像素为单位)0x142 位图高度(以像素为单位)0x162 颜色平面数,每个像素的位数必须为10x182,典型值为1、4、8 和24 注意:

OS/2 BITMAPCOREHEADER 位图未压缩,不能是16 或32 位/像素。 Windows 2.x BITMAPCOREHEADER 与OS/2 1.x BITMAPCOREHEADER(如上表所示)的不同之处在于,图像宽度和高度字段是有符号整数而不是无符号整数。

BITMAPINFOHEADER

出于兼容性原因,大多数应用程序使用旧版本的DIB 标头保存文件。由于Windows 2000之后不再支持OS/2,因此当前常见的Windows格式是BITMAPINFOHEADER标头。下表说明了这一点,其中除非另有说明,所有值都是无符号整数。

OffsetSize(bytes)Windows BITMAPINFOHEADER0x0E4 此DIB 标头的大小(字节数)。对于此版本,该值为400x124 位图宽度(以像素为单位)(有符号整数)0x164 位图高度(以像素为单位)(有符号整数)0x1A2 颜色平面的数量必须是10x1C2 的每个像素占用的位数,即颜色深度图像。典型值是所使用的1、4、8、16、24和320x1E4压缩方法,可用值如下表所示0x224图像大小。指原始位图数据的大小(详细见下文),与文件大小不是同一概念。可以为BI_RGB 位图指定图像的虚拟00x264 水平分辨率,以每米像素(有符号整数)为单位0x2A4 图像的垂直分辨率,以每米像素(有符号整数)为单位0x2E4 调色板中的颜色数量,当为0,表示颜色数是默认的0x324重要颜色数。当为0时,表示所有颜色都很重要;通常不使用这种压缩方法(字节0x1E ~0x21)。有效值如下表所示:

值由(识别)压缩方式注释0BI_RGB 无压缩,最常见1BI_RLE8RLE 8 位/像素只能用于8 位/像素格式的位图2BI_RLE4RLE 4 位/像素只能用于4 位/像素格式的位图像素3BI_BITFIELDS 位域或霍夫曼1D 压缩(BITMAPCOREHEADER2) 像素格式由位掩码指定,或位图为霍夫曼1D 压缩(BITMAPCOREHEADER2) 4BI_JPEGJPEG 或RLE-24 压缩(BITMAPCOREHEADER2) 位图包含JPEG 图像或为RLE-24 压缩(BITMAPCOREHEADER2) 5BI_PNG PNG 位图包含PNG 图像6BI_ALPHABITFIELDSRGBA 适用于Windows CE .NET 4.0 及更高版本的位域掩码11BI_CMYK 无仅Windows 图元文件CMYK12BI_CMYKRLE8RLE-8 仅Windows 图元文件CMYK13BI_CMYKRLE4RLE-4 仅Windows 图元文件CMYK注意:BI_JPEG和BI_PNG仅对打印机驱动有效,不支持屏幕渲染。3336 0

三、附加位掩码 Extra bit masks

此项目仅在存在时可用DIB 标头为BITMAPINFOHEADER,压缩方法成员设置为BI_BITFIELDS 或BI_ALPHABITFIELDS。

见本文末尾

四、调色板

此部分定义图像中使用的颜色。如上所述,位图图像是逐像素存储的,每个像素由一个或多个字节的值表示,因此调色板的目的是告诉应用程序这些值对应的实际颜色。

调色板中的条目数为(n是DIB头中指定的每个像素占用的位数)或DIB头中指定的调色板中的颜色数。

典型的位图文件使用RGB 颜色模型。在大多数情况下,调色板中的每个条目占用4 个字节,并依次代表蓝色、绿色、红色、0x00。每个条目的格式如下:

typedef 结构体tagRGBQUAD {

字节rgbBlue;

字节rgbGreen;

字节rgbRed;

BYTE rgb保留;

RGBQUAD;其中,第四个字节一般不使用(大多数应用将其设置为0),也有一些应用将第四个字节用作alfa通道。

调色板是一个字节块(一个表),列出了图像使用的颜色。对于索引位图(每个像素占用1、4 或8 位),调色板的作用是告诉应用程序该像素的实际颜色。此时,像素中存储的值就是这个调色板这个像素颜色的索引,根据该索引得到该像素的真实颜色。对于非索引位图,调色板的目的是列出位图中使用的颜色,以优化颜色显示功能有限的设备,并方便将来转换为不同的像素格式和着色。

如上所述,当像素为每像素16 位或更高时,通常不使用调色板。

五、像素存储

位图中的像素以行为单位存储,存储时每行按4字节对齐,即每行的大小向上舍入为4字节的倍数(32位DWORD)。如果图像的高度大于1,则多个填充的对齐行形成像素数组。

所以存储一行像素所需的字节数可以通过以下公式计算:

RowSize的单位是字节,ImageWidth的单位是像素;请注意公式中的特殊括号,表示向上和向下舍入。

像素阵列 Pixel array (bitmap data)

像素阵列是一个32 位DWORD 块,逐个像素地描述图像,每个像素由1 个或多个像素表示。

通常,像素是从下到上、从左到右保存的。但如果不使用BITMAPCOREHEADER,未压缩的Windows位图也可以从上到下存储,图像高度将为负数。

每行末尾填充几个字节的数据(不一定是0),使行的长度为4 字节的倍数。像素阵列读入内存后,每行的起始地址必须是4的倍数。此限制仅适用于内存中的像素阵列。存储时,只要求每行的大小为4字节的倍数即可。文件的偏移地址没有限制。

例如:对于24位彩色位图,如果其宽度为1像素,则每行除了3个字节的数据(蓝、绿、红)外,还会填充1个字节;而如果宽度为2,如果宽度为3个像素,则需要2个字节的padding;如果宽度为3个像素,则需要3个字节的填充;如果宽度为4 像素,则不需要填充。

压缩

索引彩色图像可以使用4 位或8 位RLE 或Huffman 1D 算法进行压缩OS/2 BITMAPCOREHEADER2 24 位彩色图像可以使用24 位RLE 算法进行压缩16 位彩色和32 位彩色图像始终是未压缩的数据如果需要,任何颜色深度的图像都可以以未压缩的形式存储

像素格式

这里的单位是bbp(位/像素),每像素位数

1 bbp,每像素1 位,支持2 种不同的颜色。每个比特存储像素值,每个字节存储8个像素。最左边的像素对应于第一个字节的最高位。像素的颜色由调色板给定,像素为0代表调色板中一个条目的颜色;像素1 表示调色板2 bbp 中第二个(最后一个)条目的颜色,每像素2 位,支持4 种不同的颜色。每个字节对应4个像素,最左边的像素是第一个字节的最高两位。使用2 位索引4 bbp,每像素4 位,可以对调色板中最多4 种颜色进行索引,支持16 种不同的颜色。每个字节存储2个像素,最左边的像素是第一个字节的高4位。像素值索引调色板,最多16 个条目8 bbp,每像素8 位,支持256 种颜色。每个字节存储1 个像素。像素值索引调色板,最多包含256 个颜色条目16 bbp,每像素16 位,支持65536 种颜色。每2个字节存储1个像素。像素的不透明度(alfa)、红、绿、蓝值都存储在这两个字节中。 24 bbp,每像素24 位,支持16,777,216 种颜色。每3个字节存储1个像素。每个像素值按顺序存储实际的红、绿、蓝值:蓝、绿、红(每通道8位)32 bbp,每像素32位,支持4,294,967,296种颜色,每个4字节存储一个像素。这个DWORD存储像素

位掩码

的不透明度(alfa)、红、绿、蓝值,为了解决哪些位定义哪些样本的歧义,DIB头提供了某些默认值以及特定的BITFIELDS,它们是位掩码,用于定义像素中特定位组到特定通道的成员资格。下图定义了该机制:

32 位像素的BITFIELDS 机制BITFIELDS 位掩码定义的样本字段必须是连续且不重叠的,但样本字段的顺序是任意的。最常见的字段顺序是:Alpha、蓝色、绿色、红色(MSB 到LSB)。仅当DIB 标头的Compression 成员设置为BI_BITFIELDS 时,红色、绿色和蓝色位掩码才有效。只要alpha 位掩码存在于DIB 标头中或DIB 标头的Compression 成员设置为BI_ALPHABITFIELDS[5](仅限Windows CE),它就有效。

16 位BITFIELDS 机制中所有可能的像素格式DIB

BMP 文件例子解析

使用绘图软件以bmp 格式绘制图像。以下是一些示例:

单色图像

后面有一个小的BMP单色图像[图像上传失败.(image-fd91f4-1572484665335)]

放大后是这样的:

BMP单色示例截图,文件内容为(全部以十六进制表示):

偏移0123456789abcdef0x00424d5600000000000003e00000028000x10000005000000060000000100010000000x2000001800000000 000000000000000000x300000000000000000000ffffff00f8000x400000f00000000000000098000000f0000x50000000000000 解析它:

0x00~0x0d

14字节,位图文件头

0x00~0x01

2个字节,文件头的前两个字节是字符"BM"

0x02~0x05

4个字节,这是BMP文件的大小。这里的值为0x56=86,从实际查看可以知道,该文件的大小确实是86字节。

0x06 ~0x07

2个字节,保留字节,这里是0

0x08~0x09

2个字节,自己保留,这里是0

0x0a~0x0d

4个字节,位图数据的地址,这里是0x3e,也就是说实际的像素是从0x3e开始存储的。

0x0e~0x11

4个字节,DIB头的大小(字节数),这里的值是0x28=40,由此我们可以知道这个文件使用的DIB头版本是BITMAPINFOHEADER,由此我们可以确定从0x0e~开始的内容0x35 表示DIB 标头

0x0e~0x35

40字节,DIB头

0x0e~0x11

4字节,DIB头的大小(字节数),这里的值为0x28=40

0x12~0x15

4字节,位图宽度,单位是像素(有符号整数),这里是5

0x16 ~0x19

4字节,位图高度,单位是像素(有符号整数),这里是6

0x1A~0x1B

2字节,颜色平面编号,必须为1,这里为1

0x1C~0x1D

2字节,每个像素占用的位数,这里是1

0x1E~0x21

4字节,使用的压缩方式,这里为0,表示不压缩

0x22~0x25

4字节,图像大小。指原始位图数据的大小。这里是0x18=24,这个值是实际存储像素时占用的字节数。该图像有6行,每行占用4个字节,像素总共占用24个字节

0x26~0x29

4字节,图像的横向分辨率,这里为0

0x2A0x2D

4字节,图像的垂直分辨率,这里为0

0x2E~0x31

4字节,调色板中的颜色数量。当为0时,表示颜色数默认为。这里是0,表示有个调色板

0x32~0x35

4字节,重要颜色的数量。这里是0

0x36 ~0x3d

8 字节,调色板。从上可以看出,调色板条目数为2,每个条目占用4个字节,所以调色板总共占用8个字节

0x36~0x39

4个字节,调色板的第一个颜色,这里的值都是0,从调色板的定义可以看出,这代表RGB全部为0的颜色,即黑色0x3a~0x3d

4个字节,调色板的第二种颜色,这里的值是0xff、0xff、0xff、0x00。从调色板的定义来看,表示所有RGB颜色都是255,即白色0x3e~0x55

24字节,存储实际图像像素

0x3e~0x41

4个字节,存储图像的第一行。该图像是1 bbp 图像。每个位存储一个像素。0x3e的值为0xf8=11111000b,即第一行第一个像素的颜色为调色板的颜色。第二个颜色是白色,第二个像素也是白色……第五个像素是白色。这个图像一行只有5个像素,后面是0,因为保存时图像一行的字节数必须是。 4 的倍数,后跟3 个字节。

0x42~0x45

4字节,存储图像的第2行

0x52~0x55

4个字节,第6行存储图像

16色图像

后面有一个小的BMP 16 色图像[图像上传失败.(image-887bb6-1572484665335)]

放大后是这样的:

BMP16颜色示例截图,文件内容为(全部以十六进制表示):

偏移0123456789abcdef0x00424d8e000000000000007600000028000x10000005000000060000000100040000000x200000180000000000000000000000000 00x30000000000000000000000800000800x4000000080800080000000800 0800080800x50000080808000c0c0c0000000ff0000ff0x60000000ffff00ff0 0 0000ff00ff00ffff0x700000ffffff00888b8000ff8ba000ccaa0x80a0007ccc7000bbb7600000999000 解析它:

0x00~0x0d

14字节,位图文件头

0x00~0x01

2个字节,文件头的前两个字节是字符"BM"

0x02~0x05

4个字节,这是BMP文件的大小。这里的值为0x8e=142,从实际查看可以知道,该文件的大小确实是142字节。

0x06 ~0x07

2个字节,保留字节,这里是0

0x08~0x09

2个字节,自己保留,这里是0

0x0a~0x0d

4个字节,位图数据的地址,这里是0x76,也就是说实际的像素是从0x76开始存储的。

0x0e~0x11

4个字节,DIB头的大小(字节数),这里的值是0x28=40,由此我们可以知道这个文件使用的DIB头版本是BITMAPINFOHEADER,由此我们可以确定从0x0e~开始的内容0x35 表示DIB 标头

0x0e~0x35

40字节,DIB头

0x0e~0x11

4字节,DIB头的大小(字节数),这里的值为0x28=40

0x12~0x15

4字节,位图宽度,单位是像素(有符号整数),这里是5

0x16 ~0x19

4字节,位图高度,单位是像素(有符号整数),这里是6

0x1A~0x1B

2字节,颜色平面编号,必须为1,这里为1

0x1C~0x1D

2个字节,每个像素占用的位数,这里是4,表示每个像素存储4位

0x1E~0x21

4字节,使用的压缩方式,这里为0,表示不压缩

0x22~0x25

4字节,图像大小。指原始位图数据的大小。这里是0x18=24,这个值是实际存储像素时占用的字节数。该图像有6行,每行占用4个字节,像素总共占用24个字节

0x26~0x29

4字节,图像的横向分辨率,这里为0

0x2A0x2D

4字节,图像的垂直分辨率,这里为0

0x2E~0x31

4字节,调色板中的颜色数量。当为0时,表示颜色数量为默认。

%5En" alt="2^n" />个。此处为 0 ,表示调色板有个 0x32 ~ 0x35 4 个字节,重要颜色数。此处为 0 0x36 ~ 0x3d 64 个字节,调色板。由上面可知,调色板条目数量为 16 ,每个条目占 4 个字节,所以调色板一共占 64 个字节 0x36 ~ 0x39 4 个字节,调色板第 1 个颜色,此处值全为 0, 由调色板的定义可知,此处表示RGB全为0的颜色,即黑色 0x3a ~ 0x3d 4个字节,调色板的第 2 个颜色,此处值为 0x00, 0x00, 0x80, 0x00, 由调色板的定义可知,表示BGR分别为 0、0、128 的颜色 0x3e ~ 0x41 4个字节,调色板的第 3 个颜色,此处值为 0x00, 0x80, 0x00, 0x00, 由调色板的定义可知,表示BGR分别为 0、128、0 的颜色0x72 ~ 0x75 4个字节,调色板的第 16 个颜色,此处值为 0xff, 0xff, 0xff, 0x00, 由调色板的定义可知,表示BGR分别为 255、255、255 的颜色,即白色 0x76 ~ 0x8d 24 个字节,此处储存实际的图像像素点 0x76 ~ 0x79 4 个字节,存储图像的第一行,图像为 4 bbp 的图像,每 4 个 bit 位保存一个像素,0x76 的值 0x88 保存两个像素,第一行的第 1 个像素颜色为调色板中的第 9 个颜色为 BRG 分别为 192、192、192 的颜色,第 2 个像素也为此颜色。第 2 个字节存储第 3 第 4 个像素,第 3 个字节的高位存储第 5 个像素,后面填充 0 ,因为图像的一行在保存时字节数必须为 4 的倍数,后面再填充 1 个字节。 0x7a ~ 0x7d 4 个字节,存储图像的第 2 行0x8a ~ 0x8d 4 个字节,存储图像的第 6 行

256色图像

这后面有一个很小的 BMP 256色图[图片上传失败...(image-78d072-1572484665335)] 放大后显示为: BMP256色例子截图其文件内容为(全部以16进制表示): Offset0123456789abcdef0x0000424d66040000000000003604000028000x0010000005000000060000000100080000000x0020000030000000000000000000000000000x0030000000000000000000000000800000800x0040000000808000800000008000800080800x00500000c0c0c000c0dcc000f0caa60000200x0060400000206000002080000020a00000200x0070c0000020e000004000000040200000400x0080400000406000004080000040a00000400x0090c0000040e000006000000060200000600x00a0400000606000006080000060a00000600x00b0c0000060e000008000000080200000800x00c0400000806000008080000080a00000800x00d0c0000080e00000a0000000a0200000a00x00e0400000a0600000a0800000a0a00000a00x00f0c00000a0e00000c0000000c0200000c00x0100400000c0600000c0800000c0a00000c00x0110c00000c0e00000e0000000e0200000e00x0120400000e0600000e0800000e0a00000e00x0130c00000e0e000400000004000200040000x0140400040006000400080004000a00040000x0150c0004000e000402000004020200040200x0160400040206000402080004020a00040200x0170c0004020e000404000004040200040400x0180400040406000404080004040a00040400x0190c0004040e000406000004060200040600x01a0400040606000406080004060a00040600x01b0c0004060e000408000004080200040800x01c0400040806000408080004080a00040800x01d0c0004080e00040a0000040a0200040a00x01e0400040a0600040a0800040a0a00040a00x01f0c00040a0e00040c0000040c0200040c00x0200400040c0600040c0800040c0a00040c00x0210c00040c0e00040e0000040e0200040e00x0220400040e0600040e0800040e0a00040e00x0230c00040e0e000800000008000200080000x0240400080006000800080008000a00080000x0250c0008000e000802000008020200080200x0260400080206000802080008020a00080200x0270c0008020e000804000008040200080400x0280400080406000804080008040a00080400x0290c0008040e000806000008060200080600x02a0400080606000806080008060a00080600x02b0c0008060e000808000008080200080800x02c0400080806000808080008080a00080800x02d0c0008080e00080a0000080a0200080a00x02e0400080a0600080a0800080a0a00080a00x02f0c00080a0e00080c0000080c0200080c00x0300400080c0600080c0800080c0a00080c00x0310c00080c0e00080e0000080e0200080e00x0320400080e0600080e0800080e0a00080e00x0330c00080e0e000c0000000c0002000c0000x03404000c0006000c0008000c000a000c0000x0350c000c000e000c0200000c0202000c0200x03604000c0206000c0208000c020a000c0200x0370c000c020e000c0400000c0402000c0400x03804000c0406000c0408000c040a000c0400x0390c000c040e000c0600000c0602000c0600x03a04000c0606000c0608000c060a000c0600x03b0c000c060e000c0800000c0802000c0800x03c04000c0806000c0808000c080a000c0800x03d0c000c080e000c0a00000c0a02000c0a00x03e04000c0a06000c0a08000c0a0a000c0a00x03f0c000c0a0e000c0c00000c0c02000c0c00x04004000c0c06000c0c08000c0c0a000f0fb0x0410ff00a4a0a000808080000000ff0000ff0x0420000000ffff00ff000000ff00ff00ffff0x04300000ffffff00efefef67ef000000ffff0x04406f6f79000000fcfc7afafa000000dbd20x0450fcd2b40000007ffb7fb37100000052520x04605f4f4f000000对其进行解析: 0x00 ~ 0x0d 14 字节,位图文件头 0x00 ~ 0x01 2 字节,文件头最开头两字节为字符 "BM" 0x02 ~ 0x05 4 字节,为 BMP 文件的大小,此处值为 0x0466 = 1126, 由实际查看可知其文件 确实为 1126 字节大小 0x06 ~ 0x07 2 字节,保留字节,此处为 0 0x08 ~ 0x09 2 字节,保留自己,此处为 0 0x0a ~ 0x0d 4 字节,位图数据的地址,此处为 0x0436, 表示实际的像素在 0x0436 处开始存储。 0x0e ~ 0x11 4 字节,DIB表头的大小(字节数),此处值为 0x28 = 40, 可以由此得知,此文件使用的 DIB 头版本为 BITMAPINFOHEADER, 由此我们可确定 从 0x0e ~ 0x35 的内容为 DIB 头 0x0e ~ 0x35 40 字节,DIB 头 0x0e ~ 0x11 4 字节,DIB表头的大小(字节数),此处值为 0x28 = 40 0x12 ~ 0x15 4 字节,位图宽度,单位为像素(有符号整数),此处为 5 0x16 ~ 0x19 4 字节,位图高度,单位为像素(有符号整数),此处为 6 0x1A ~ 0x1B 2 字节,色彩平面数,必须为 1,此处为 1 0x1C ~ 0x1D 2 字节,每个像素所占位数,此处为 8, 表示每个像素由 8 个bit位存储 0x1E ~ 0x21

4 字节,所使用的压缩方法,此处为 0 ,表示无压缩 0x22 ~ 0x25 4 个字节,图像大小。指原始位图数据的大小。此处为 0x30 = 48,此值为实际存储像素时占用的字节数。本图像为 6 行,每行 5 个像素,每个像素使用 1 个字节,因为每行存储字节必须为 4 的倍数,所以每行使用 8 个字节,像素共占用 6*8=48 个字节 0x26 ~ 0x29 4 个字节,图像的横向分辨率,此处为 0 0x2A ~ 0x2D 4 个字节,图像的纵向分辨率,此处为 0 0x2E ~ 0x31 4 个字节,调色板的颜色数,为0时表示颜色数为默认的个。此处为 0 ,表示调色板有个 0x32 ~ 0x35 4 个字节,重要颜色数。此处为 0 0x36 ~ 0x0435 1024 个字节,调色板。由上面可知,调色板条目数量为 256 ,每个条目占 4 个字节,所以调色板一共占 1024 个字节 0x36 ~ 0x39 4 个字节,调色板第 1 个颜色,此处值全为 0, 由调色板的定义可知,此处表示RGB全为0的颜色,即黑色 0x3a ~ 0x3d 4个字节,调色板的第 2 个颜色,此处值为 0x00, 0x00, 0x80, 0x00, 由调色板的定义可知,表示BGR分别为 0、0、128 的颜色 0x3e ~ 0x41 4个字节,调色板的第 3 个颜色,此处值为 0x00, 0x80, 0x00, 0x00, 由调色板的定义可知,表示BGR分别为 0、128、0 的颜色0x0432 ~ 0x0435 4个字节,调色板的第 256 个颜色,此处值为 0xff, 0xff, 0xff, 0x00, 由调色板的定义可知,表示BGR分别为 255、255、255 的颜色,即白色 0x0436 ~ 0x465 48 个字节,此处储存实际的图像像素点 0x436 ~ 0x43d 8 个字节,存储图像的第一行,图像为 8 bbp 的图像,每 8 个 bit 位保存一个像素,即每个字节保存一个像素,0x436 的值 0xef,表示第一行的第 1 个像素颜色为调色板中的第 240 个颜色,BRG 分别为 192、160、224 的颜色,第 2 个像素其颜色索引为 0x437 的值,也是 0xef。后面的字节依次存储第 3 、4、5个像素的颜色索引。因为图像的一行在保存时字节数必须为 4 的倍数,后面再填充 3 个字节。 0x43e ~ 0x445 8 个字节,存储图像的第 2 行0x45e ~ 0x465 8 个字节,存储图像的第 6 行

24位图像

这后面有一个很小的 BMP 24位图[站外图片上传中...(image-7c27fb-1572484665335)] 放大后显示为: BMP24位BMP例子截图其文件内容为(全部以16进制表示): Offset0123456789abcdef0x00424d96000000000000003600000028000x10000005000000060000000100180000000x20000060000000000000000000000000000x30000000000000d7c3ffc9aeffc9aeff3b0x4085ffd7c3ff00ffffffffffff5d9fff500x5097ff20ff2000ff1010ff101040ff40000x60ff0010f10900ff6060ff3030ff0000ff0x70404090cf750040f6ff00f2ff40f6ff790x80c55a4cb122004040404040405b55f2240x901ced241ced00对其进行解析: 0x00 ~ 0x0d 14 字节,位图文件头 0x00 ~ 0x01 2 字节,文件头最开头两字节为字符 "BM" 0x02 ~ 0x05 4 字节,为 BMP 文件的大小,此处值为 0x96 = 150, 由实际查看可知其文件 确实为 150 字节大小 0x06 ~ 0x07 2 字节,保留字节,此处为 0 0x08 ~ 0x09 2 字节,保留自己,此处为 0 0x0a ~ 0x0d 4 字节,位图数据的地址,此处为 0x36, 表示实际的像素在 0x36 处开始存储。 0x0e ~ 0x11 4 字节,DIB表头的大小(字节数),此处值为 0x28 = 40, 可以由此得知,此文件使用的 DIB 头版本为 BITMAPINFOHEADER, 由此我们可确定 从 0x0e ~ 0x35 的内容为 DIB 头 0x0e ~ 0x35 40 字节,DIB 头 0x0e ~ 0x11 4 字节,DIB表头的大小(字节数),此处值为 0x28 = 40 0x12 ~ 0x15 4 字节,位图宽度,单位为像素(有符号整数),此处为 5 0x16 ~ 0x19 4 字节,位图高度,单位为像素(有符号整数),此处为 6 0x1A ~ 0x1B 2 字节,色彩平面数,必须为 1,此处为 1 0x1C ~ 0x1D 2 字节,每个像素所占位数,此处为 0x18=24, 表示每个像素由 24 个bit位存储 0x1E ~ 0x21 4 字节,所使用的压缩方法,此处为 0 ,表示无压缩 0x22 ~ 0x25 4 个字节,图像大小。指原始位图数据的大小。此处为 0x60 = 96,此值为实际存储像素时占用的字节数。本图像为 6 行,每行 5 个像素,每个像素使用 3 个字节,因为每行存储字节必须为 4 的倍数,所以每行使用 16 个字节,像素共占用 6*16=96 个字节 0x26 ~ 0x29 4 个字节,图像的横向分辨率,此处为 0 0x2A ~ 0x2D 4 个字节,图像的纵向分辨率,此处为 0 0x2E ~ 0x31 4 个字节,调色板的颜色数,此处为 0, 24位图像不使用调色板 0x32 ~ 0x35 4 个字节,重要颜色数。此处为 0 0x36 ~ 0x95 96 个字节,此处储存实际的图像像素点 0x36 ~ 0x45 16 个字节,存储图像的第一行,图像为 24 bbp 的图像,每 24 个 bit 位保存一个像素,即每 3 个字节保存一个像素,0x36 ~ 0x38 的值 0xd7 0xc3 0x ff,表示第一行的第 1 个像素颜色 BRG 分别为 215、195、255 的颜色。后面的字节依次存储第 2、3 、4、5个像素的颜色索引。因为图像的一行在保存时字节数必须为 4 的倍数,后面再填充 1 个字节。 0x46 ~ 0x55 16 个字节,存储图像的第 2 行0x86 ~ 0x95 8 个字节,存储图像的第 6 行

用户评论

荒野情趣

我记得小时候玩电脑画图的时候经常用BMP文件保存图片。

    有10位网友表示赞同!

南宫沐风

BMP图像质量好,就是文件体积容易变大.

    有12位网友表示赞同!

不离我

很多老软件还支持BMP格式的图片

    有5位网友表示赞同!

半梦半醒半疯癫

好奇BMP的缩写到底是什么?

    有15位网友表示赞同!

苍白的笑〃

现在好像很少人用BMP格式保存图片了,是吗?

    有7位网友表示赞同!

花容月貌

学习一下BMP文件格式的原理,可以 deepen 我的计算机知识储备。

    有17位网友表示赞同!

单身i

想问问BMP格式和其他常见的图片格式有什么区别?

    有17位网友表示赞同!

断秋风

我做一些简单图形设计的时候,经常用到BMP文件格式。

    有7位网友表示赞同!

▼遗忘那段似水年华

了解BPM文件格式的好处可以帮助我更好地选择合适的图片保存方式吧!

    有20位网友表示赞同!

莫飞霜

是不是可以用程序自动转换其他图片格式成BMP格式?

    有16位网友表示赞同!

幸好是你

感觉BMP文件格式的保存标准比较简单,容易理解。

    有12位网友表示赞同!

她的风骚姿势我学不来

BMP文件在网络上传下载的时候,会显得比较慢,对带宽有高的要求吗?

    有18位网友表示赞同!

陌颜

以前用过一些编辑软件可以查看BMP文件的结构信息。

    有5位网友表示赞同!

来自火星球的我

现在的新型图片格式相比BMP,是不是更优化了压缩效率和图像质量?

    有19位网友表示赞同!

沐晴つ

BMP文件格式在哪些场景下会更优势?

    有13位网友表示赞同!

还未走i

想了解一下BMP文件格式的最新发展或者改进情况。

    有11位网友表示赞同!

Hello爱情风

听说BMP文件很容易被篡改,是真的吗?

    有11位网友表示赞同!

几妆痕

有没有什么技巧可以有效压缩BMP文件的体积大小?

    有11位网友表示赞同!

逃避

学习一些关于BMP文件格式的知识可以让我更好地理解图像处理技术。

    有11位网友表示赞同!

浅笑√倾城

如果想保存高清晰度的图片,选择BMP文件格式是个不错的选择吗?

    有17位网友表示赞同!

【深入解析BMP图像文件格式:全面了解其特性和应用】相关文章:

1.蛤蟆讨媳妇【哈尼族民间故事】

2.米颠拜石

3.王羲之临池学书

4.清代敢于创新的“浓墨宰相”——刘墉

5.“巧取豪夺”的由来--米芾逸事

6.荒唐洁癖 惜砚如身(米芾逸事)

7.拜石为兄--米芾逸事

8.郑板桥轶事十则

9.王献之被公主抢亲后的悲惨人生

10.史上真实张三丰:在棺材中竟神奇复活

上一篇:爱奇艺VIP视频会员价格一览:月费、年费详情及2024年最划算会员方案推荐 下一篇:抖音快速增粉攻略:全方位涨粉丝平台解析及建群技巧汇总