1.2.1 BMP文件结构
1.2  BMP文件结构及其存取
数字图像在外存储器设备中的存储形式是图像文件,图像必须按照某个已知的、公认的数据存储顺序和结构进行存储,才能使不同的程序对图像文件顺利进行打开或存盘操作,实现数据共享。图像数据在文件中的存储顺序和结构称为图像文件格式。目前广为流传的图像文件格式有许多种,常见的格式包括BMP、GIF、JPEG、TIFF、PSD、DICOM、MPEG等。在各种图像文件格式中,一部分是由某个软硬件厂商提出并被广泛接受和采用的格式,例如BMP、GIF和PSD格式;另一部分是由各种国际标准组织提出的格式,例如JPEG、TIFF和DICOM,其中JPEG是国际静止图像压缩标准组织提出的格式,TIFF是由部分厂商组织提出的格式,DICOM是医学图像国际标准组织提出的医学图像专用格式。
BMP文件是Windows操作系统所推荐和支持的图像文件格式,是一种将内存或显示器的图像数据不经过压缩而直接按位存盘的文件格式,所以称为位图(bitmap)文件,因其文件扩展名为BMP,故称为BMP文件格式,简称BMP文件。本书对图像的算法编程都是针对BMP图像文件的,因此在本章中我们详细介绍BMP文件结构及其读写操作,以加深对图像数据的理解。
1.2.1  BMP文件结构
如图1-7所示,BMP图像文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息头(Bitmap Info Header)、颜表(Color Map)和位图数据(即图像数据,Data Bits或Data Body)。
第1部分为位图文件头BITMAPFILEHEADER,是一个结构体类型,该结构的长度是固定的,为14个字节。其定义如下:
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; 
DWORD bfSize; 
WORD bfReserved1; 
WORD bfReserved2;
DWORD bfOffBits; 字符串是什么颜
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER,
*PBITMAPFILEHEADER;
BITMAPFILEHEADER结构的各个域详细说明如下:
bfType:位图文件类型,必须是0x424D,即字符串“BM”,也就是说,所有的“*.bmp”文件的头两个字节都是“BM”。
bfSize:位图文件大小,包括这14个字节。
bfReserved1, bfReserved2:Windows保留字,暂不用。
bfOffBits:从文件头到实际的位图数据的偏移字节数,图1-7中前3个部分的长度之和。
 
图1-7  BMP文件结构示意图
第2部分为位图信息头BITMAPINFOHEADER,也是一个结构体类型的数据结构,该结构的长度也是固定的,为40个字节(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32位整数)。其定义如下:
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize;   
LONG biWidth;   
LONG biHeight;   
WORD biPlanes;   
WORD biBitCount   
DWORD biCompression; 
DWORD biSizeImage;   
LONG biXPelsPerMeter; 
LONG biYPelsPerMeter; 
DWORD biClrUsed; 
DWORD biClrImportant; 
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER,
*PBITMAPINFOHEADER;
BITMAPINFOHEADER结构的各个域的详细说明如下:
biSize:本结构的长度,为40个字节。
biWidth:位图的宽度,以像素为单位。
biHeight:位图的高度,以像素为单位。
biPlanes:目标设备的级别,必须是1。
biBitCount:每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16图)、8(256)、24(真彩图),新的BMP格式支持32位。
biCompresssion:位图压缩类型,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。这里只讨论未经压缩的情况,即biCompression=BI_RGB。
biSizeImage:实际的位图数据占用的字节数,该值的大小在第4部分位图数据中有具体解释。
biXPelsPerMeter:指定目标设备的水平分辨率,单位是像素/米。
biYPelsPerMeter:指定目标设备的垂直分辨率,单位是像素/米。
biClrUsed:位图实际用到的颜数,如果该值为零,则用到的颜数为2的biBitCount次幂。
biClrImportant:位图显示过程中重要的颜数,如果该值为零,则认为所有的颜都是重要的。
第3部分为颜表。颜表实际上是一个RGBQUAD结构的数组,数组的长度由biClrUsed指定(如果该值为零,则由biBitCount指定,即2的biBitCount次幂个元素)。RGBQUAD结构是一个结构体类型,占4个字节,其定义如下:
typedef struct tagRGBQUAD
{
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
}RGBQUAD;
RGBQUAD结构的各个域的详细说明如下:
rgbBlue:该颜的蓝分量;
rgbGreen:该颜的绿分量;
rgbRed:该颜的红分量;
rgbReserved:保留字节,暂不用。
有些位图需要颜表;有些位图(如真彩图)则不需要颜表,颜表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜,颜表也就有21=2个表项,整个颜表的大小为 个字节;对于biBitCount值为8的灰度图像,每像素占8bit,图像中有 颜,颜表也就有256个表项,且每个表项的R、G、B分量相等,整个颜表的大小为 个字节;而对于biBitCount=24的真彩图像,由于每像素3个字节中分别代表了R、G、B三分量的值,此时不需要颜表,因此真彩图的BITMAPINFOHEADER结构后面直接就是位图数据。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。