从BMP分析文件二进制流
生活日常使用的文件,例如 .png、.jpg、.pdf等,其在系统中最终是以二进制流的形式存在,而像图片显示器,pdf阅读器等,原理是读取该二进制流进行操作。假如了解了二进制流读取和解析的原理,可以自行开发对应的解析器,也可以创造属于新的文件格式,本文将从较为简单的 BMP格式 来学习如何分析文件的二进制流。
文件二进制流查看
以vscode为例,使用官方的插件 Hex Editor 可以查看文件的二进制流。文件会以16进制的方式将文件二进制流从上到下,从左到右显示。
BMP格式分析
从 BMP格式 可以看出是一种纯位图格式,下面是具体的存储结构,可以看到分六个区域
每个区域存储不同信息,像下面的位图文件头最后的4个字节存储了像素数组起始的起始地址
读取方式是从开头根据偏移量0x0A进行偏移,然后读取4个字节
BMP主要信息
由于BMP文件的信息较多,下面挑重点的进行说明,其他的可以看 BMP格式 进行查阅
像素数组
用于存储像素颜色数据的数组,像素是从下到上、从左到右保存,BMP图片的宽度从0x12,和0x16偏移量各读取4字节获取,颜色数组的16进制字节长度是 色深 * 图片宽度 * 图片高度。
色深
代表使用多少bit表示像素颜色数据 例如 #00ff00 是使用了32色深,分别表示RGB,色深小于8的时候,需要从调色板获取最终颜色。
调色板
调色板是一个颜色数据的数组,当色深小于8的时,像素数组存储的并不是最终用于渲染的颜色数据,而是一个索引,使用该索引到调色板中获取最终用于渲染的颜色。调色板起始时DIB头的结束,即偏移量0x0e,颜色板中每个颜色占4个字节,调色板颜色数量可以从偏移量0x2e读取4个字节获取,获取不到使用2的色深数次方(当前色深的所有颜色值)计算获取。