一个将图像数据保存为BMP文件的实例

发布时间:2010-11-29 00:25:08   来源:文档文库   
字号:

一个将图像数据保存为BMP文件的实例

BMP文件是Windows保存图像的一种通用文件格式,在数字图像处理方面占有重要的地位。BMP文件中保存的图像数据是一种DIB(Device-Independent Bitmap,即设备无关位图)DIB是标准的Windows位图格式,它自带颜色信息,因此调色板管理非常容易。有许多文章是关于讲述如何将BMP文件读取、显示的,而如何将数据保存为BMP文件则不是太多,本文作者通过一个实例讲述这一过程。

一、 BMP文件的结构

要想把数据正确地保存为BMP文件,首先对BMP文件的结构应该有一个清晰的了解。一个BMP文件大体上分成如下4个部分,如图1所示。

1、 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构,其定义如下:

typedef struc tagBITMAPFILEHEADER{

WORD bfType;

WORD bfSize;

WORD bfReserved1;

WORD bfReserved2;

WORD bfOffBits;

}BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

该结构的长度是固定的,为14个字节,各个域的说明如下:

bfType:指定文件类型,必须是0x4d42,即字符串“BM”。

bfSize:指定文件大小,包括这14个字节。

bfReserved1bfReserved2:保留字,为0

bfOffBits:从文件头到实际的位图数据的偏移字节数,即图1中前三个部分的长度之和。

2、 第二部分为位图信息头BITMAPINFOHEADER,它也是一个结构,其定义如下:

typedef struc 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;

该结构的长度也是固定的,为40个字节,各个域的说明如下:

biSize:指定这个结构的长度,为40个字节。

biWidth:指定图像的宽度,单位是象素。

biHeight:指定图像的高度,单位是象素。

biPlanes:必须是1

biBitCount:指定表示颜色时用到的位数,常用的值为1(黑白二色图)4(16色图)8(256色图)24(真彩色图)

biCompression:指定位图是否压缩,有效值为BI_RGBBI_RLE8BI_RLE4BI_BITFIELDSWindows位图可采用RLE4RLE8的压缩格式,BI_RGB表示不压缩。

biSizeImage:指定实际的位图数据占用的字节数,可用以下的公式计算出来:

biSizeImage = biWidth× biHeight

要注意的是:上述公式中的biWidth必须是4的整数倍(不是biWidth,而是大于或等于biWidth的离4最近的整数倍)。如果biCompressionBI_RGB,则该项可能为0

biXPelsPerMeter:指定目标设备的水平分辨率。

biYPelsPerMeter:指定目标设备的垂直分辨率。

biClrUsed:指定本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2biBitCount次幂。

biClrImportant:指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色数都是重要的。

3、 第三部分为调色板。有些位图需要调色板,有些位图,如真彩色图,不需要调色板,

它们的BITMAPINFOHEADER后面直接是位图数据。

调色板实际上是一个数组,共有biClrUsed个元素(如果该值为0,则有2biBitCount次幂个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:

typedef struct tagRGBQUAD{

BYTE rgbBlue;

BYTE rgbGreen;

BYTE rgbRed;

BYTE rgbReserved;

}RGBQUAD;

其中:

rgbBlue:该颜色的蓝色分量。

rgbGreen:该颜色的绿色分量。

rgbRed:该颜色的红色分量。

rgbReserved:保留值。

4、 第四部分就是实际的图像数据。对于用到调色板的位图,图像数据就是该象素颜色在调色板中的索引值,对于真彩色图,图像数据就是实际的RGB值。

对于2色图,用1位就可以表示该象素的颜色,所以1个字节可以表示8个象素。

对于16色图,用4位可以表示一个象素的颜色,所以1个字节可以表示2个象素。

对于256色图,1个字节刚好可以表示1个象素。

对于真彩色图,3个字节才能表示1个象素。

二、 保存实例

1、 图像数据

图像数据来源于图像采集卡所采集的图像的一部分,保存在一Buffer(char *lp1),图像高度为110个象素(保存在变量 int m_Width),宽度为228个象素(保存在变量 int m_Height,并且是4的整倍数),图像为一256色灰度图。

2、实例代码

BITMAPFILEHEADER bmfHdr; //定义文件头

BITMAPINFOHEADER bmiHdr; //定义信息头

RGBQUAD rgbQuad[256]; //定义调色板

//对信息头进行赋值

bmiHdr.biSize = sizeof(BITMAPINFOHEADER); //指定这个结构的长度

bmiHdr.biWidth = m_WidthOfModel; //指定图像的宽度

bmiHdr.biHeight = m_HeightOfModel; //指定图像的高度

bmiHdr.biPlanes = 1; // 指定图像的位数,必须是1

bmiHdr.biBitCount = 8; //指定表示颜色时用到的位数

bmiHdr.biCompression = BI_RGB; //指定位图是否压缩

bmiHdr.biSizeImage = m_WidthOfModel*m_HeightOfModel; //指定实际的位图数据占用的字

节数

bmiHdr.biXPelsPerMeter = 0;

bmiHdr.biYPelsPerMeter = 0;

bmiHdr.biClrUsed = 0;

bmiHdr.biClrImportant = 0;

//对调色板进行赋值

for(i=0; i<256; i++)

{

rgbQuad[i].rgbBlue = (BYTE)i;

rgbQuad[i].rgbGreen = (BYTE)i;

rgbQuad[i].rgbRed = (BYTE)i;

rgbQuad[i].rgbReserved = 0;

}

//对文件头进行赋值

bmfHdr.bfType = (WORD)0x4D42; //;((WORD)('M'<<8) | 'B')

bmfHdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+ sizeof(RGBQUAD)*256 + m_WidthOfModel*m_HeightOfModel); //指定文件大小

bmfHdr.bfReserved1 = 0;

bmfHdr.bfReserved2 = 0;

bmfHdr.bfOffBits=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFO HEADER)+sizeof(RGBQUAD)*256); //从文件头到实际的位图数据的偏移字节数

//保存文件

CFile fp;

fp.Open("d:\\Model.bmp",CFile::modeCreate | CFile::modeWrite);

fp.Write((LPSTR)&bmfHdr,sizeof(BITMAPFILEHEADER)); //写文件头

fp.Write((LPSTR)&bmiHdr,sizeof(BITMAPINFOHEADER)); //写信息头

fp.Write((LPSTR)rgbQuad,sizeof(RGBQUAD)*256); //写调色板

fp.Write(lpvBuffer2Bits,m_WidthOfModel*m_HeightOfModel);//写数据

fp.Close();

以上代码在VC++5.0环境调试通过。

2、 实例图像

2为通过以上代码保存的图像文件Model.bmp

2

三、结束语

本文作者对BMP文件的结构进行了较为清晰的剖析,对各部分的变量作了较为详尽的说明,并给出了将图像数据保存为BMP文件实例的详细代码,原代码在VC++5.0环境下调试通过。

参考文献

1、 何斌 等编著.Visual C++数字图像处理.人民邮电出版社,北京,2001.4

2、 王晖 等编著.精通Visual C++ 6.0.电子工业出版社,北京,2001.6

本文来源:https://www.2haoxitong.net/k/doc/fc56ba4be45c3b3567ec8b3f.html

《一个将图像数据保存为BMP文件的实例.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式