内存中的 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_色盘