0


bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等


一、概述

bmp

是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,随着windows的流行,

bmp

位图格式被广泛应用。

位图按照是否与设备相关分类可以分为:设备相关位图DDB(device-dependent bitmap)、设备无关位图DIB(device-independent bitmap)。

按照像素深度分类可以分为:

1bit

位图(2色)、

4bit

位图(16色)、

8bit

位图(256色)、

16bit

位图(65536色-高彩色)、

24bit

位图(1670万色-真彩色)、

32bit

位图(1670万色-增强型真彩色)。

二、.bmp格式文件详解

.bmp

位图文件由四个部分组成:

  • 位图文件头(bitmap-file header)
  • 位图信息头(bitmap-information header)
  • 调色板(color table)
  • 位图数据(图像数据,Data Bits 或Data Body)阵列

下面对文件结构的这几个部分进行详细的介绍。
本节举例说明的位图是100*100的4bit位图,在windows查看其属性如下:
在这里插入图片描述
在这里插入图片描述

2.1 位图文件头

Windows BMP位图文件头共14个字节,包含了文件类型标志、文件大小等信息,定义的结构体也比较,详细说明如下:

  • 结构体:
typedefstructBITMAPFILEHEADER/* size: 40 */{unsignedshort bfType;// 文件的类型,该值必需是0x4D42,也就是字符'BM'。unsignedlong  bfSize;// 位图文件的大小,用字节为单位unsignedshort bfReserved1;// 保留,必须设置为0unsignedshort bfReserved2;// 保留,必须设置为0unsignedlong  bfOffBits;// 位图数据距离文件开头偏移量,用字节为单位} BITMAPFILEHEADER;
  • 结构体字段详细说明:在这里插入图片描述

2.2 位图信息头

Windows BMP位图信息头共40个字节,包含了文件类型标志、文件大小等信息,定义的结构体也比较,详细说明如下:

  • 结构体
typedefstructWINBMPINFOHEADER/* size: 40 */{unsignedlong  biSize;// BITMAPINFOHEADER结构所需要的字数unsignedlong  biWidth;// 图像宽度,单位为像素unsignedlong  biHeight;// 图像高度,单位为像素,负数,则说明图像是正向的unsignedshort biPlanes;// 为目标设备说明位面数,其值将总是被设为1unsignedshort biBitCount;// 一个像素占用的bit位,值位1、4、8、16、24、32unsignedlong  biCompression;// 压缩类型unsignedlong  biSizeImage;// 位图数据的大小,以字节为单位unsignedlong  biXPelsPerMeter;// 水平分辨率,单位 像素/米unsignedlong  biYPelsPerMeter;// 垂直分辨率,单位 像素/米unsignedlong  biClrUsed;// unsignedlong  biClrImportant;// } WINBMPINFOHEADER;
  • 结构体字段详细说明:在这里插入图片描述

2.3 调色板

调色板

是为了让一些颜色深度比较小(

1bit、4bit、8bit

)的位图可以表示颜色而设置的。

调色板

存储颜色,后面的

位图数据

存储颜色索引,这样

调色板+位图数据

就可以表示颜色了。需要注意的是,

16bit

24bit

32bit

的位图一般没有调色板,因为从

16bit

开始就直接使用位图数据表示颜色了。

调色板可以理解为一个颜色数组,数组的每个元素就是一个4字节的argb值,数组大小由位图的颜色深度决定:

1bit

位图的调色板有2个颜色(2x4=8字节)、

4bit

位图的调色板有16个颜色(16x4=64字节)、

8bit

位图的调色板有256个颜色(256x4=1024字节),整个调色板大小就是对应的颜色个数乘以4。

调色板数据大小 = 位图文件头的bfOffBits数值 - 位图文件头大小 - 位图信息头大小;
  • 位图文件举例在这里插入图片描述 上图红色框内的数据是4bit位图的调色板,总共有16个颜色:0x00000000、0x00111111、0x00222222、0x00333333、0x00444444、0x00555555、0x00666666、0x00777777、0x00888888、0x00999999、0x00aaaaaa、0x00bbbbbb、0x00cccccc、0x00dddddd、0x00eeeeee、0x00ffffff;数据大小等于0x76-54个字节。下面看一下1bit的位图数据:在这里插入图片描述 上图红色框内的数据1bit的调色板,总共有2个颜色:0x00ffffff、0x00000000,数据大小等于0x3e-54个字节。

2.4 位图数据

位图数据分两种情况,如果带调色板,则

位图数据

存放的是

调色板的颜色索引

,如果不带调色板,则

位图数据

存放实际的

argb值

。另外,由于Windows默认的扫描的最小单位是4字节,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充,填充的值有可能是乱码。

下图是

4bit

带调色板位图数据,每4个

bit

表示一个颜色索引,这里每

4bit

的值都是

f

,表示用调色板的第15个颜色来填充每个像素。另外,可以看到最下面一行有两个字节数值是

0x22

,这就是4对齐补充的第51、52字节。
在这里插入图片描述

三、位图的其他知识

3.1 压缩的位图

压缩的位图是指

位图数据

进行过压缩的位图,其压缩类型存储在

位图信息头

biCompression

字段,下面简单介绍一下是怎样压缩位图数据的。

BI_RGB

:不压缩

BI_REL8

:采用

8比特游程编码

压缩位图数据

BI_REL4

:采用

4比特游程编码

压缩位图数据

3.1.1 游程编码

游程编码,也叫行程编码,英文名称是:

Run Length Encoding

,简称

RLE


其编码原理是:将数据中连续出现

n

次的数据

a

,使用

na

来表示。

举例:
如果有下面一段数据,由

5个1,4个2,7个3

组成,

1111122223333333

使用游程编码表示为

514273

,51表示5个1,42表示4个2,73表示7个3
这样就把16个数字压缩成6个数字了。

3.1.2 位图游程编码

位图游程编码主要有两种:针对

4bit

位图的

BI_REL4

,针对

8bit

位图的

BI_REL8

位图游程编码的编码方式:
1、每两个字节组成一个信息单元;
2、如果第一个字节大于0,则表示相连的像素的个数;第二个字节表示这些像素的值(调色板的索引)。
3、如果第二个字节等于0,则第二个字节可能有三种取值:

0、1、2

 3.1、第二个字节值为

0

,表示行结束
 3.2、第二个字节值为

1

,表示位图结束
 3.3、第二个字节值为

2

,表示像素位置增量,之后的一个信息单元(2字节)指明了下个像素相对于当前像素的增量。

举例:下图是100x100的

BI_REL4

压缩的4bit位图数据,图中红色框的两个0x64表示宽高都为

100

,第0x1e位的4个字节为0x2,表示压缩方式为

BI_REL4


从0x76(图中蓝色框)开始是位图数据,第一个字节是

0

,第二个字节是

2

,表示位置增量;第三个字节为

a

(十进制为 10),表示下个像素是在当前像素的10个像素之后;第四个字节0没有任意含义,可能是为了对齐。
从0x7a(图中紫色框)开始的

0x0aff

是一个信息单元,第一个字节表示0x0a(十进制为 10)的连续的像素,第二个字节表示这10个像素的值都为

f


接下去的一个信息单元

0xa0

在这里插入图片描述

参考:
https://share.blog.csdn.net/article/details/1414661

标签: windows linux 着色器

本文转载自: https://blog.csdn.net/wkd_007/article/details/128214157
版权归原作者 wkd_007 所有, 如有侵权,请联系我们删除。

“bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等”的评论:

还没有评论