位图文件
简介
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 :
位图文件头 BITMAPFILEHEADER :
偏移
|
域的名称
|
长度
/
字节
|
内容
|
0000h
(
0
)
|
bfType
|
2
|
两字节的内容用来识别位图的类型,存储的是两个字符的
ASCII
码。
B
M
(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
字节的边界。