每天一点点音视频_bmp_dip头

内存中的 DIB

一个 BMP 文件加载到内存中,变成了一个 DIB 数据结构。DIB 的格式与 BMP 的结构相似,但是没有之前讲的 14 个字节的 BMP 文件头。

DIB 头

DIB 有很多版本,微软对它扩展了好多次。这些版本都有名字,比如 BITMAPCOREHEADER, OS22XBITMAPHEADER, BITMAPINFOHEADER 等等,每一个版本都有特定的大小, 所以可以通过这个大小来区分不同的版本,所有的版本,他们的第一个字段都是大小,所以就可以区分不同的版本,来解析剩下的字段了。

这里我们以 BITMAPINFOHEADER 为例子来看一看他的字段:

偏移(十六进制) 偏移(10进制) 大小(bytes) BITMAPINFOHEADER 对它的声明作用
0E 14 4 这个头的大小
12 18 4 bitmap 的宽, 单位像素, 有符号整数
16 22 4 bitmap 的高, 单位像素, 有符号整数
1A 26 2 色盘的数量,固定为1
1C 28 2 每个像素的位数, 是图像的颜色深度,通常值为 1, 4, 8, 16, 24, 32
1E 30 4 使用的压缩方法
22 34 4 图像大小, 这是原始图像数据的大小,当压缩算法是 BI_RGB 时,值为0
26 38 4 图像水平的分辨率, 每公尺的像素数,符号整数
2A 42 4 图像垂直的分辨率, 每公尺的像素数,符号整数
2E 46 4 色盘中颜色的数量, 或者 0 表示默认 2^n
32 50 4 重要颜色的数量, 0表示每一种颜色,通常忽略这个字段

通常,我们提到 BMP 都是原始数据,就是没有压缩的,而提到压缩的图像格式就是 JPG, GIF, PNG 等等。但是, BMP 也有压缩算法, 下面举几个例子:

标志 压缩算法 注释
0 BI_RGB 不压缩 这就是最经常的情况了
4 BI_JPGE
5 BI_PNG

还有其他很多, 不想列了,自行 wiki, 竟然,还支持 JPGE, PNG, 高的这么复杂,这么乱。

我看了一个 wiki 下面的 C++ 实现的位图加载程序, 发现这种这种东西的确是 C/C++ 更适合, 定义一个结构,一下就可以将文件里面的结构映射到结构的对应字段上。仔细想了想, Java 好像不可以呀

明天: 每天一点点音视频_bmp_色盘