-
BMP
图像文件格式
对于现存的所有的图像文件格式,我们在这里主要介绍
BMP
图
像文件格式,并且文件
里的图像数据是未压缩的,
因为图像的数
字化处理主要是对图像中的各个像素进行相应的处
理,而未压缩的
BMP
图像中的像素数值正好与实际要处理的数字图像相对应,这种格式的
文件最合适我们对之进行数字化处理。
请读者记住,
压缩过的图像是无法直接进行数字化处
理的,如
JPEG
p>
、
GIF
等格式的文件,此时首先要对图像
文件解压缩,这就要涉及到一些比较
复杂的压缩算法。后续章节中我们将针对特殊的文件
格式如何转换为
BMP
格式的文件问题
作专门的论述,经过转换,我们就可以利用得到的未压缩的
BMP
文件格式进行后续处理。
对于
JPEG
、
GIF
等格式,由于涉及到压缩算法,这要求读者掌握一定
的信息论方面的知识,
如果展开的话,
可以写一本书,
限于篇幅原因,我们只作一般性的讲解,有兴趣的朋友可以
参考相关书籍
资料。
一、
BMP
文件结构
1.
BMP
文件组成
BMP
文件由文件头、位图信息头、
颜色信息和图形数据四部分组成。文件头主要包含文件
的大小、文件类型、图像数据偏离
文件头的长度等信息;位图信息头包含图象的尺寸信息、
图像用几个比特数值来表示一个
像素、
图像是否压缩、
图像所用的颜色数等信息。
颜色信息
包含图像所用到的颜色表,
显示图像时需用
到这个颜色表来生成调色板,
但如果图像为真彩
色,既图像的每
个像素用
24
个比特来表示,文件中就没有这一块信息,也就不
需要操作调
色板。
文件中的数据块表示图像的相应的像素值,<
/p>
需要注意的是:
图像的像素值在文件中的
存放顺序为从左到右,从下到上,也就是说,在
BMP
文件中首
先存放的是图像的最后一行
像素,
最后才存储图像的第一行像素
,
但对与同一行的像素,
则是按照先左边后右边的的顺
序存储的;
另外一个需要读者朋友关注的细节是:
文件存储图像的每一行像素值时,
如果存
储该行像素值所占的
字节数为
4
的倍数,则正常存储,否则,需要在后端补
0
,凑足
4
的倍
数。
2. BMP
文件头
BMP
文
件头数据结构含有
BMP
文件的类型、文件大小和位图起始位置
等信息。其结构定义
如下
: typedef struct
tagBITMAPFILEHEADER
{
WORD
bfType; //
位图文件的类型,必须为“
BM
”
DWORD bfSize; //
位图文件的大小,以字节为单位
WORD bfReserved1; //
位图文件保留字,必须为
0
WORD
bfReserved2; //
位图文件保留字,必须为
0
DWORD bfOffBits; //
位图数据的起始位
置,
以相对于位图文件头的偏移量表示,
以字节为单
位
} BITMAPFILEHEADER
p>
;该结构占据
14
个字节。
3.
位图信息头
BMP
位图信息头数据用于说明位图
的尺寸等信息。其结构如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //
本结构所占用字节数
LONG
biWidth; //
位图的宽度,以像素为单位
LONG biHeight; //
位图的高度,以像素为单位
WORD
biPlanes; //
目标设备的平面数不清,必须为
1
WORD biBitCount//
每个像素所需的位数,
必须是
1(
双色
), 4(16
色
)
,
8(256<
/p>
色
)
或
24(<
/p>
真彩色
)
之一
DWORD biCompression; //
位图压缩类型,
必须是
0(
不压缩
),1(BI_RLE8
压缩类型
)
或
2(BI_RL
E4
压缩类型
)
之一
< br>
DWORD biSizeImage; //
位图的大小,以字节为单位
LONG
biXPelsPerMeter; //
位图水平分辨率,每米像素数
LONG biYPelsPerMeter; //
位图垂直分辨率,每米像素数
DWORD biClrUsed;//
位图实际使用的颜色表中的颜色数
DWORD biClrImportant;//
位图显示过程中重要的颜色数
} B
ITMAPINFOHEADER
;该结构占据
40
个字节。
注意:
对于
BMP
文件
格式,
在处理单色图像和真彩色图像的时候,
无论图象数据多么
庞大,
都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么<
/p>
16
色图像
采用
RLE4
压缩算法,
256
色图像采用
RLE8
压缩算法。
4.
颜色表
颜色表用于说明位图中的颜色,
它有若干个表项,
每一个表项是一个
RGBQUAD
类型的结构,
p>
定义一种颜色。
RGBQUAD
结构的定义
如下
:
typedef struct tagRGBQUAD {
BYTErgbBlue;//
蓝色的亮度
< br>(
值范围为
0-255)
BYTErgbGreen; //
绿色的亮度
(
值范围为
0-255)
BYTErgbRed; //
红色的亮度
< br>(
值范围为
0-255)
BYTErgbReserved;//
保留,必须为
0
}
RGBQUAD;
颜色表中
RGBQUAD
结构数据的个数由
BITMAPINFOHEADER
中的
b
iBitCount
项来确定,当
biBitCount=1,
4,8
时,分别有
2,16,256
个
颜色表项,当
biBitCount=24
时,图像为真彩色,
图
像中每个像素的颜色用三个字节表示,分别对应
R
、
G
、
B
值,图像文件没有颜色表项。位
图信息头和颜色表组成位图信息,
BITMAPINFO
结构定义如下
:
typedef struct
tagBITMAPINFO {