数字图像与机器视觉基础入门——图片格式入门学习(BMP)
数字图像与机器视觉基础入门——图片格式入门学习(BMP)
1)用图画板或其他图像编辑软件(Photoshop/GIMP、cximage、IrfanView等)打开一个彩色图像文件,将其分别保存为 32位、16位彩色和256色、16色、单色的位图(BMP)文件,对比其文件大小,并计算分析这些图片在内存中的存储容量是多少?当保存为BMP文件时,将用文件头来记录图像的属性,请问:BMP文件头是多大?是什么格式?上述5个类型的BMP的文件头内容有什么差异?
一、位图(BMP)
1、简介
BMP是英文Bitmap的简写,它是Windows操作系统中的标准图像文件格式,能够被多种Windows应用程序所支持。随着Windows操作系统的流行与丰富的Windows应用程序的开发,BMP位图格式理所当然地被广泛应用。这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱来的缺点--占用磁盘空间过大。所以,BMP在单机上比较流行。
位图文件的总体构造如下
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
1bmp文件头(bmp file header):提供文件的格式、大小等信息
2位图信息头(bitmap information):提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
3调色板(color palette):调色板就是索引与其对应的颜色的映射表
4位图数据(bitmap data):保存的各个像素的颜色,也就是图像数据
下面结合Windows结构体的定义,通过一个表来分析这四个部分。
我们先将,将jpg格式的原图分别保存为单色,16色,24色,256位图,再分析具体内容,转换成bmp的结果大小分别如下
我们再通过notepad++将文件读取成为hex格式分析每个部分
(PS:在bmp文件中如果一个数据需要用几个字节来表示的话,那么该数据的存放字节顺序为“低地址村存放低位数据,高地址存放高位数据”,即小端方式也就是倒过来的)
2、文件头
正如前面说的文件头包含了图片的相关文件信息,具体的内容介绍如下表
对照着我们刚刚的图片进行分析,通过notepad打开单色位图文件,然后使用hexeditor打开
在0--1 他的数据时 424d,424dh = 'BM',表示这是Windows支持的位图格式。有很多声称开头两个字节必须为'BM'才是位图文件,从上表来看应为开头两个字节必须为'BM'才是Windows位图文件。
2-5 :0697beh 这个是表示的这个图片的大小
通过进制转换可以得到为432062,对比文件信息发现是一致的
6-9 :这里为保留字段都要为0
A-D:0000003e 表示这图片数据的偏移字节,转化为十进制为62,再在后面可以验证这个数字
3、位图信息头
同样地,Windows为位图信息头定义了如下结构体:
继续对照数据文件
0E-11:00000028h = 40,这就是说我这个位图信息头的大小为40个字节,前面我们已经说过位图信息头一般有40个字节,既然是这样,为什么这里还要给一个字段来说明呢?当时由于要区别不同的版本字节头是有不同大小的,如下图所示
出于兼容性的考虑,大多数应用使用了旧版的位图信息头来保存文件。而 OS/2 已经过时了,因此现在最常用的格式就仅有V3 header了。因此,我们在前面说位图信息头的大小为40字节。
12-15:000008fch = 2300,表示图像宽为2300像素,
16-19:000005dch = 1500,表示图像高为1500像素。还有通过这里可以发现这是一个正数,说明图像数据是从图像左下角到右上角排列的。
通过查看图片属性发现是一致的,这个图片就是2300*1500像素大小的
1A-1B:0001h, 该值总为1。
1C-1D:0001h = 1, 表示每个像素占1个比特,即该图像共有2种颜色。由于这里是单色位图所以是温和的
1E-21:00000000h,代表BI_RGB, 说明本图像不压缩。
22-25:00069780h,在使用BI_RGB时可以设置为0,但我这里他表示是图像的大小
26-29:00001274h,水平分辨率
2A-2D:00001274h,垂直分辨率
2E-31:00000000h ,本来表示的本位图实际使用的颜色索引数,阅读上文的表格可得知这个图片这里为0表示需要所有的调色板项
32-35:00000000h ,本来说明本位图重要的颜色索引数为多少,这个图片这里为零表示都很重要。
4、调色板
下面的数据就是调色板了。调色板其实是一张映射表,标识颜色索引号与其代表的颜色的对应关系。它在文件中的布局就像一个二维数组 其中N表示总的颜色索引数,每个里头的四个元素分别表示该索引对应的B、G、R和Alpha的值,每个分量占一个字节。如不设透明通道时,Alpha为0。
在我这里使用的图片中,只有2个颜色索引。也就是从36开始到3d的8个字节00 00 00 00 和 FF FF FF 00,由于没设透明度所以Alpha是0,只有两个颜色所以一个是白色一个是黑色。
现在我们再来看最开始的位图信息偏移量的那个62
一共有2种颜色,每个颜色占用4个字节,就是一共8个字节,再加上前面的文件信息头和位图信息头的54个字节加起来一共是62个字节。也就是说在位图数据出现之前一共有62个字节,与我们在文件信息头得到的信息:文件头到文图数据区的偏移为62个字节一致,也就是像0A--0D中数据一样,位图文件从3E开始。
5、位图数据
下面就是位图数据了,每个像素占一个字节,取得这个字节后,以该字节为索引查询相应的颜色,并显示到相应的显示设备上就可以了。
注意:由于位图信息头中的图像高度是正数,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。
也即我们见到的第一个像素60是图像最左下角的数据,第二个人像素60为图像最后一行第二列的数据,…一直到最后一行的最后一列数据,后面紧接的是倒数第二行的第一列的数据,依此类推。
如果图像是24位或是32位数据的位图的话,位图数据区就不是索引而是实际的像素值了。下面说明一下,此时位图数据区的每个像素的RGB颜色阵列排布:
24位RGB按照BGR的顺序来存储每个像素的各颜色通道的值,一个像素的所有颜色分量值都存完后才存下一个下一个像素,不进行交织存储。
32位数据按照BGRA的顺序存储,其余与24位位图的方式一样。
像素的排布规则与前述一致。
2)将一幅彩色照片分别保存为BMP、JPG、GIF和PNG格式,对比它们的文件大小比,判断图像的压缩保存后的压缩比率。
二、其他图片格式以及图像压缩比率
首先依然是将原图存储为另外几种格式的图片,查看文件大小如下
对比文件大小可以发现,png压缩约为20%,jpg约为5%,gif约为10%
(关于另外几种图片格式具体内容以后有机会在学习,再对这博客进行补充吧,先完成作业要紧😀)
参考网站:
https://blog.csdn.net/nicholas_duan/article/details/90717599