Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1156881
  • 博文数量: 222
  • 博客积分: 5262
  • 博客等级: 大校
  • 技术积分: 3028
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-22 19:10
文章分类

全部博文(222)

文章存档

2012年(2)

2011年(192)

2010年(28)

分类: 嵌入式

2010-12-23 18:55:30

前言

记得本科时候讲《计算机体系结构》的老师(很遗憾忘了他姓名)评价过中外教材的差别,他说按照老外的体系结构教材,你就真的能够做出一个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

关键色彩数

水%

阅读(1575) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~