之前做了一个 BMP图片的中值滤波,也只是大概了解BMP图片格式怎样的,参考了很多资料,发现他们写的都挺好,但是他们写的再好也只是他们的,我看了也不会印象很深,索性再来比葫芦画瓢自己分析一遍,加深一下印象。
自己要分析bmp的话,随便找个bmp吧,下面贴的图下载下来不太对。
一、BMP图片格式
1.BMP图片的组成
BMP文件主要有四部分组成,位图头、位图信息、调色板、位图数据。
我比较喜欢把这四部分叫做,文件头,文件信息,调色板,图片数据。我觉得这样叫比较好理解各部分都是什么内容。
文件头:存放文件的相关信息,如文件类型,大小。使用前14字节
文件信息:就是图片宽高等信息
调色板:大小由颜色索引决定
图片数据:就是图片数据呗
什么是调色板?
例如一个图片只有黑白两色,黑色是FF,白色是00,要是用RGB像素来表示,那得多浪费空间啊。如果使用调色板,就可以用索引表示:0 0 0 …1 1 1
其中索引0表示00,白色,索引1表示FF,黑色
只用1位索引来表示像素值,多简单啊,得节省多少空间啊,这种表示方法就是用了调色板
看不懂的话可以参考这个
什么是魔数?就是文件类型的编码吧,如BMP用42 4D
表示,放在文件的开头,魔数参考
二、BMP图片十六进制解析
图片采用16进制打开,图放在最下面了
1、文件头
如下,这是BMP的前14个字节
42 4D 36 EC 5E 00 00 00 00 00 36 00 00 00
a)前2个字节42 4D
就是表示BM。
b)第3-6字节是BMP文件的大小,36 EC 5E 00
,注意哦这是小端模式,读出来是0x005EEC36
,对应十进制就是6220854
,图片大小就是6220854字节
c)第7-10字节保留,以后拓展用,00 00 00 00
d)第11-14字节表示像素数据的偏移,表示第多少字节开始是图片像素值,这里是36 00 00 00
,即0x36=54
前14字节
2、信息头
15-18字节是 BMP文件信息的大小,`0x00000028` 是 40 字节大小
19-22字节80 07 00 00表示图像宽度,十进制为1920
23-26字节38 04 00 00表示图像高度,十进制为1080
27-28字节01 00好像表示调色板个数,通常都是1
29-30字节18 00表示bpp,即一个像素用多少位表示,十进制为24
31-34字节00 00 00 00表示压缩类型,如下
0(不压缩),1(BI_RLE8压缩类型),2(BI_RLE4压缩类型)
35-38字节00 EC 5E 00,表示图像大小,十进制为6220800
前面第11-14表示像素值偏移,刚好0x36=54,第3-6字节是BMP文件的大小,6220854,
有没有发现什么?
39-42字节是 Width resolution in pixels per meter,水平分辨率,每米像素数,本
文是 00 ,所以不管它
43-47字节是 Height resolution in pixels per meter,垂直分辨率,每米像素数,
本文是 00 ,所以不管它
47-50字节是颜色表中的颜色索引数(也就是颜色表中的颜色数),本文没有索引表,是真彩
色(没有调色板的RGB模式称为真彩色),所以是00
51-54字节表示对图像显示有重要影响的颜色索引数码,本文是00 ,代表全都重要。本文没
用到索引表,不用管这个字段。
55-58这里其实就是图片数据了,但是在有调色板的图片中,这块表示调色板
3、调色板
无
4、图片数据
图中位置开始往后就是图片数据了,那这块00 00 00 00
是图片的哪个位置呢?左下,左上,右下,右上?来修改一下这个值改成 FF FF FF FF FF FF
发现图片左下角有三个白色像素,其实BMP的存储方式是从左向右,从下到上
,开头的链接有这个存储方式示意图。
改数据开始的三个像素,作用在左下角
改数据最后的三个像素,作用在右上角