最近做实验需要用到一些BMP文件,惭愧的发现自己根本不知道该怎么用,查了查资料更惭愧的发现自己对电脑里面各种文件的储存方式和数据结构一点了解也没有,那就开始学一下记点笔记,如果有错的地方希望看到的朋友不吝赐教。该文章基于另一位博主的Python读取并解析 bmp 文件完成,是对BMP文件的一些学习笔记,有需要具体读取代码的朋友可以去超链接内找寻。
BMP文件
数据在计算机中只能一维储存,一段一维的BMP数据大概就长下面那个样子,对我们来说最为有用的、也就是我们眼睛所看到的图像自身的信息便储存在BMP文件中的位图信息部分。其他部分各有各的作用。
文件头
一图简介
BMP文件头内包含文件最为基础的信息,在下图我随便选取了一个BMP文件使用Python提取了它的文件头信息(\x00占据一个字节长度代表0)。
BMP文件的文件类型均为‘BM’(如下所示);后面的【f u \x00 \x00】代表文件的大小,读的方式为 0 0 u f,u和f为ascii码的117和102,文件大小就是117*256+102=30054;后面4位0为保留位置全部为0;最后的【6 \x00 \x00 \x00】代表位图距离偏移量,读的方式为0 0 0 6,6为ascii码的54,位图偏移量即为54;也就是说我们这张图片没有调色板信息,图片的存储为14字节文件头+40字节信息头+30000字节位图信息。
信息头
一图简介
信息头的长度为40位,各部分储存的信息如下图所示,我会在后面结合测试图说明各部分的具体意义。
下面是测试图提取的信息头前十六位,前四位是图像的信息头长度【(000】 这半个小括号是一位ascii码!!不要以为是括号,读的方式为 0 0 0 (,左半括号的对应的数值为40,我们已经直到信息头的长度就是40;接下来的四位是图像宽度【d000】,d对应的数值为100,这张图片宽为100像素;接下来的图像高度【d000】也是100,所以我们能够得知这张图片为1001003刚好是30000与之前文件头中的位图信息长度刚好对应;接下来的两位为颜色平面数【\x01\x00】也就是十六进制的1;接下来的两位是比特数【\x18\x00】十六进制的24说明这张图片是24位图。位图相关简介链接
然后是接下来的16位。前四位是压缩类型【\x00\x00\x00\x00】十六进制的0也就是无压缩;接下来的四位是图像大小【0 u \x00 \x00】117*256+48=30000没毛病嗷;后面八位均为0也就是没有给出水平分辨率和垂直分辨率信息。
最后八位均为0说明使用所有调色板项和无重要颜色。
位图信息
BMP的位图储存方式为标准计算机坐标系,举个例子,我们人眼看到的如下所示的图片,BMP的存储方式为789456123,且其存储方式为BGR三通道,假设三通道的像素值均为下图所示,该图片的BMP位图信息为777888999444555666111222333。得知了这些信息以后,我们便可以根据文件头和信息头中的各种信息提取BMP的图片文件。
下图就是我们测试图的位图信息,我们可以每三个数值做一次提取,提取100次组成一行,重复100次完成该张100x100x3的图像提取。
结果图如下