位图文件

简介

 

BMP(Bitmap-File)格式是最常用的图像文件存取格式之一,是微软为其Windows环境设置的标准图像格式,BMP位图文件默认的文件扩展名是“.BMP”或者“.bmp”,有时它也会以“.DIB”或者“RLE”为扩展名。用BMP格式存放的图像几乎可以被所有的图像显示软件读取。

BMP图形文件是Windows采用的图像文件格式,在Windows环境下运行的所有图像软件都支持BMP图像文件格式。Windows系统内部个图像绘制操作都是以BMP为基础的。Windows3.0以前的BMP文件格式与显示设备有关,因此把这种BMP图像文件格式称为设备相关位图(Device Dependent Bitmap,DDB)文件格式。Windows3.0以后的BMP文件都与显示设备无关,因此把这种BMP文件格式称为设备无关位图(Device Independent Bitmap,DIB)格式。

 

BMP文件格式

摘要

 

         每个BMP文件只能存放一张图像。图像数据是否采用压缩方式存放,取决于文件的大小与格式,即压缩处理是BMP图像文件的一个选项,用户可以根据需要进行选择。

         其中,非压缩格式是BMP图像文件所采用的一种通用格式,它按照一定的顺序忠实的记录图像中每一个像素的颜色值。如果用户确定将BMP文件格式压缩处理,则Windows设计了一种压缩方式:如果位图为16色模式,则采用RLE4压缩方式,如果图像为256色模式,则采用RLE8压缩方式。

         BMP图像数据文件格式可以存储为单色,16色,256色和真彩色四种图像数据,其数据的排列顺序与一般文件不同,它以图像的左下角作为起点存储图像,而不是以图像的坐上角为起点。而且BMP图像文件格式中还存在另外一个与众不同的特点,即其调色板数据所采用的数据结构中,红,绿,蓝三种基色数据的排列顺序也恰好与其他图像文件格式相反。总之,BMP图像文件格式拥有许多适合于Windows环境的新特色,而且随着Windows版本的不断更新,微软也在不断的改进BMP图像文件格式。

 

BMP中包含的域

 

BMP位图文件是由四个部分组成:位图文件头(bitmap-file header),位图信息头(bitmap-information header),调色板(color table)和定义位图的字节阵列(图像数据阵列)。其对应的结构体或类型分别为:BITMAPFILEHEADER,BITMAPINFOHEADER,RGBQUAD,BYTE。

1.   位图文件头
位图文件头BITMAPFILEHEADER:

偏移

域的名称

长度/字节

内容

0000h(0)

bfType

2

两字节的内容用来识别位图的类型,存储的是两个字符的ASCII码。

BM(0x4D42):Windows

BA/CT/CP/IC/PT: OS/2

0002h(2)

bfSize

4

整个文件的大小

0006h(6)

bfReserved1

2

保留未用,必须为0

0008h(8)

bfReserved2

2

保留未用,必须为0

000Ah(10)

bfOffBits

4

从文件开头到图像数据开始之间的字节数,有了该数据能方便地跳过位图的信息头

 

 

2.   位图信息头BITMAPINFOHEADER

 

偏移

域的名称

长度/字节

内容

000Eh(14)

biSize

4

文件信息头的长度

40(28h):Windows

00012h(18)

biWidth

4

位图的宽度,以像素为单位

00016h(22)

biHeight

4

位图的高度,以像素为点为

001Ah(26)

Biplanes

2

位图的为平面数(该值总是为1)

001Ch(28)

biBitCount

2

每个像素的位平面数,有下面几种情况:

1:单色位图

4:16色位图

8:256色位图

16:16bit高彩色位图

24:24bit真彩色位图

32:32bit增强型真彩色位图

001Eh(30)

biCompression

4

压缩说明:

0:不压缩(用BI_RGB表示)

1:RLE8,使用8位RLE压缩方式(用BI_RLE8表示)

2:RLE4,使用4位RLE压缩方式(用BI_RLE4表示)

3:Bitfields:位域存放方式(用BI_BITFIELDS表示)

0022h(34)

biSizeImage

4

位图数据的大小,以字节为单位。该数必须是4的倍数。当图像存储的是非压缩数据的时候,它的取值可以为0,实际上,此时位图数据的大小可以通过biBitCount,biWidth,biHeight等计算出来

0026h(38)

biXPelsPerMeter

4

用像素/米表示的水平分辨率

002Ah(42)

biYPelsPerMeter

4

用像素/米表示的垂直分辨率

002Eh(46)

biClrUsed

4

位图使用的颜色数,如果为0则表示使用了全部可能的颜色

0032h(50)

biClrImportant

4

指定重要的颜色数。当该域的值等于颜色数时(或者等于0时),表示所有颜色都一样重要

 

3.   调色板

 

调色板又叫彩色映像表,使用每个像素为1,4或者8为的图像必须有一个调色板,相对应的调色板的大小分别为2,16或者256个表项。如果图像没有使用相对应的全部颜色,则调色板仅记录使用过的颜色,此时调色板会小一些。也就是说,如果位图信息头中的biClrUsed字段非零,则它记录的是使用的颜色数目,同时它也是彩色映像的表项号码。若该字段为0则彩色映像为全大小,也就是说色深为1,4,8的图像,调色板分别具有2,16,256个表项。

对于16为和24为的图像,没有调色板,图像是直接RGB彩色,此时biClrUsed字段不为0,以提供一个建议的调色板大小,不过并没有多少实际意义。

由于显示设备可能不具备图像所需的那么多的颜色,因此彩色映像中的表项在排列顺序应该是最重要的颜色排在前面。位图信息头中的biClrImportant字段如果不为0,则指出了对于好的图像重新生成多少种颜色是重要的。

彩色映像表RGBQUAD结构定义:

偏移

域的名称

长度/字节

内容

0

rgbBlue

1

调色板项的蓝色值

1

rgbGreen

1

调色板项的绿色值

2

rgbRed

1

调色板项的红色值

3

rgbReserved

1

保留未用,必须为0

 

4.   图像数据阵列

 

紧跟在调色板之后的是图像数据阵列,它包含所有的位图数据字节,这些数据可能是彩色调色板的索引号,也可以是实际的RGB值。

图像的每一扫描行由表示图像像素的连续的字节组成,每一个扫描行对应的字节数取决于图像的色深和图像的宽度。扫描行是由底向上存储的,这就是说,阵列中的第一个字节表示位于左下角的像素,而最后一个字节表示位图右上角的像素。

图像数据中的阵列可以是压缩的,也可以是不压缩的:每个像素可以用一位表示,也可以用32位表示,这些都是由前面讲过相关字段决定。下面分别说明不同色深的位图中图像数据阵列到底是如何排列的。

(1)         色深1位的位图

每个像素只用一位表示,每个字节可以表示8个像素,字节中的最高位对应于最左边的像素。

(2)         色深4位的位图

对没有压缩的图像,每个字节可以表示2个像素,高4位为左边的像素,且每行填充到一个4字节的边界上。

(3)         色深8位的位图

 

对没有压缩的图像,每个字节表示一个像素。每行填充到4字节边界。

(4)         色深24位的位图

 

每个像素用3个字节表示,顺序依次为红,绿和蓝的值。每行用0填充到4字节的边界。