前言
记得本科时候讲《计算机体系结构》的老师(很遗憾忘了他姓名)评价过中外教材的差别,他说按照老外的体系结构教材,你就真的能够做出一个CPU来(虽然只能做出很老很老的CPU),但国内的教材就很难教到这个程度。
几个月前我从零开始写了一个简单的bmp解码库,现在用一篇文章把其中的关键内容记录下来,希望能够达到让别人照着文章就可以开发出任何语言绑定的bmp解码库的程度,以便日后我可以放心地忘却,因为我的脑子里总是不能同时记住太多的东西。
BMP简介
BMP是一种与硬件设备无关的图像文件格式,使用非常广。BMP是Windows环境中交换与图有关的数据的一种标准,在Windows环境中运行的图形图像软件都支持BMP图像格式。
相对来讲,BMP格式比较简单,它只包含两个重要参数:编码格式(Encoding)和像素位数(bpp, bit-per-pixel)。到目前为止,BMP格式所支持的所有像素位数与编码格式的组合如下:
序号 |
像素位数(bpp) |
编码格式(Encoding) |
1 |
1 |
bit |
2 |
4 |
bgr(blue-green-red) |
3 |
4 |
rle(run-length encode) |
4 |
8 |
bgr |
5 |
8 |
rle |
6 |
grayscale |
bgr |
7 |
grayscale |
rle |
8 |
16 |
bgr |
9 |
16 |
bitfields-555 |
10 |
16 |
bitfields-565 |
11 |
16 |
bitfields-customized |
12 |
24 |
bgr |
13 |
32 |
bgr |
14 |
32 |
bitfields-888 |
15 |
32 |
bitfields-customized |
其中24bpp称为真彩(true-color)图像,应用最为广泛。16bpp的bmp图像拥有存储空间小,解析速度快,仿真彩效果好等特点,经常出现在游戏软件中。grayscale(灰度)图像其实是8bpp的一种情况。
文件结构
典型的BMP图像文件由四部分组成:
1:文件头,它包含BMP图像文件的类型、内容尺寸和起始偏移量等信息;
2:图像参数,它包含图像的宽、高、压缩方法,以及颜色定义等信息;
3:调色板,可选部分,bpp较小的位图需要调色板;有些位图,比如24bpp(真彩色)图就不需要调色板;
4:位图数据,这部分的内容因位图实际像素位数和编码格式而不同,在真彩位图中直接使用RGB真彩色值;而有调色板的位图则使用调色板中颜色索引值。
数据类型
先定义几个数据类型以便于描述。
byte —— 8 bits
word —— 16 bits
int/uint/dword —— 32 bits
文件头
BMP的文件头共14个字节。
字节顺序 |
数据结构 |
描述 |
1,2 |
word |
高8位为字母’B’,低8位为字母’M’ |
3,4,5,6 |
uint |
文件尺寸 |
7,8 |
word |
保留字1 |
9,10 |
word |
保留字2 |
11,12,13,14 |
uint |
位图数据部分相对于文件首的起始偏移量 |
数据部分偏移量的存在,说明图像数据部分并不一定要紧随图像参数或调色板之后放置,BMP图片的制作者其实可以在调色板之后、数据部分之前填充任何内容,只要正确地设置偏移量即可。
图像参数信息
这一个数据块共40字节或56字节。前40字节的内容如下:
字节顺序 |
数据结构 |
描述 |
15,16,17,18 |
uint |
当前结构体的大小,通常是40或56 |
19,20,21,22 |
int |
图像宽度(像素) |
23,24,25,26 |
int |
图像高度(像素) |
27,28 |
word |
这个字的值永远是1 |
29,30 |
word |
每像素占用的位数,即bpp |
31,32,33,34 |
uint |
压缩方式 |
35,36,37,38 |
uint |
图像的尺寸(字节数) |
39,40,41,42 |
int |
水平分辨率,pixels-per-meter |
43,44,45,46 |
int |
垂直分辨率,pixels-per-meter |
47,48,49,50 |
uint |
引用色彩数 |
51,52,53,54 |
uint |
关键色彩数 |
水%
阅读(1533) | 评论(0) | 转发(0) |