BMP位图格式的内存存储格式

Posted 紫月小猫咪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BMP位图格式的内存存储格式相关的知识,希望对你有一定的参考价值。

**********************************************************************************************************

2018-05-29    实验室   晚上整理总结

参考博客:https://blog.csdn.net/q673327335/article/details/8432384

***********************************************************************************************************

BMP(全称Bitmap)是Window操作系统中的标准图像文件格式

可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。

它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。BMP文件的图像深度可选lbit、4bit、8bit及24bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。

组成

  典型的BMP图像文件由四部分组成:

  1:位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;

  2:位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;

  3:调色板,这个部分是可选的,有些位图需要调色板,有些位图比如真彩色图(24位的BMP)就不需要调色板

  4:位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

***********************************************************************************************************

1、彩色BMP图片

     54个字节的图像头文件 + width*height*3的图像数据

     数据排列方式:B G R(第一个像素点)  B G R(第一个像素点) ... ... ...

 

2、灰度图BMP

      54字节的图像头文件  + 1024个字节的调色板  +  width*height的数据

***********************************************************************************************************

可以用besnew软件打开图片,查看内部存储格式

比如一张8192*2048的灰度图(有1024的颜色表)

 

存储格式:     低位    高位

1.位图文件头

0,1:42 4D 为位图的标志。如果转换成 ASCII 码的话就是 BM。

2-5:(01 00 04 36)H = 16,778,294(bytes),表示文件大小为16,778,294bytes,也可以通过查看文件大小信息知道。

6-9:(00 00 00 00)H为保留字。

10-13:(00 00 04 36)H = 1078D,文件起始位置标志,表示文件从第54+1024=1078位开始。

2.位图信息头

14-17:(00 00 00 28)H = 40D,表示位图信息头的长度,即为40 bytes。

18-21:(00 00 20 00)H = 8192D,表示位图宽度,即为8192 pixels。

22-25:(00 00 08 00)H = 2048D,表示位图高度,即为2048 pixels。存储方式为从最后一行先存,最后存第一行//高度值为负数,则表示存储顺序为从上到下

26-27:(00 01)H,表示设备级别

28-29:(00 08)H = 8D,表示位图色彩级别,即为 8位灰度图。

30-33:(00 00 00 00)H,表示压缩类型,0表示不压缩

34-37:(01 00 00 00)H = 16,777,216D,位图阵列表字节数,即为921600 bytes。

38-41:(00 00 00 00)H,表示水平分辨率

42-45:(00 00 00 00)H,表示垂直分辨率

46-49:(00 00 01 00)H,表示位图实际使用的颜色表中的颜色变址。

50-53:(00 00 00 00)H,表示位图显示过程中被认为重要颜色变址数。

3.颜色表

  颜色表用于说明(灰度图)位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:

  typedef struct tagRGBQUAD { 

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

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

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

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

  } RGBQUAD;

 我们平时看到的伪彩色图,可以对应着改变BGR的值,比如颜色表索引24,将BGR分别改为15,25,75等,就可以出现伪彩色图。

 

4.像素存储组织方式

BMP存储像素值的方式为从下至上,从左至右,紧随着文件头存储的字节为图像最下一行的数值,从左下角开始依次存储。

22 22 22 23 ... 为图像左下角像素的数值,依次向右存储,最后一行扫描完后,紧接着存储上一行,最后一个byte存储的是图像右上角像素的数值。

可用MATLAB读取BMP图片后对比内存存放方式,就一目了然了。

 

以上是关于BMP位图格式的内存存储格式的主要内容,如果未能解决你的问题,请参考以下文章

常见图片格式详解系列---BMP位图--

C++如何把位图保存到数组中

PNG和BMP格式的图片各有啥优缺点?

JPEG、GIF、PNG、BMP哪种图片格式的图片清晰一点?

BMP格式详解

BMP格式详解