一个将图像数据保存为BMP的实例.doc

上传人:大米 文档编号:560524553 上传时间:2023-12-29 格式:DOC 页数:4 大小:59.51KB
返回 下载 相关 举报
一个将图像数据保存为BMP的实例.doc_第1页
第1页 / 共4页
一个将图像数据保存为BMP的实例.doc_第2页
第2页 / 共4页
一个将图像数据保存为BMP的实例.doc_第3页
第3页 / 共4页
一个将图像数据保存为BMP的实例.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《一个将图像数据保存为BMP的实例.doc》由会员分享,可在线阅读,更多相关《一个将图像数据保存为BMP的实例.doc(4页珍藏版)》请在金锄头文库上搜索。

1、一个将图像数据保存为BMP文件的实例王军伟(中国农业大学东校区BMP文件是Windows保存图像的一种通用文件格式,在数字图像处理方面占有重要的地位。BMP文件中保存的图像数据是一种DIB(Device-Independent Bitmap,即设备无关位图),DIB是标准的Windows位图格式,它自带颜色信息,因此调色板管理非常容易。有许多文章是关于讲述如何将BMP文件读取、显示的,而如何将数据保存为BMP文件则不是太多,本文作者通过一个实例讲述这一过程。一、 BMP文件的结构BITMAPFILEHEADER位图文件头(只用于BMP文件)bfType = “BM” bfSize bfRese

2、rved1 bfReserved2 bfOffBits BITMAPINFOHEADER位图信息头biSize biWidth biHeight biPlance biBitCount biCompression biSizeImage biXPelsPerMeter biYPelsPerMeter biClrUsed biClrImportant Palette调色板单色DIB有2个表项 16色DIB有16个表项或更少 256色DIB有256个表项或更少真彩色DIB没有调色板 DIB PixelsDIB图像数据象素按照每行每列的顺序排列 每一行的字节数必须是4的整倍数图1 BMP文件结构示意

3、图要想把数据正确地保存为BMP文件,首先对BMP文件的结构应该有一个清晰的了解。一个BMP文件大体上分成如下4个部分,如图1所示。王军伟,在读博士研究生,中国农业大学(东区)214#信箱,研究方向:图像处理,智能交通1、 第一部分为位图文件头BITMAPFILEHEADER,它是一个结构,其定义如下:typedef struc tagBITMAPFILEHEADER WORD bfType; WORD bfSize; WORD bfReserved1; WORD bfReserved2; WORD bfOffBits;BITMAPFILEHEADER, FAR *LPBITMAPFILEHEA

4、DER, *PBITMAPFILEHEADER;该结构的长度是固定的,为14个字节,各个域的说明如下: bfType:指定文件类型,必须是0x4d42,即字符串“BM”。 bfSize:指定文件大小,包括这14个字节。 bfReserved1,bfReserved2:保留字,为0。 bfOffBits:从文件头到实际的位图数据的偏移字节数,即图1中前三个部分的长度之和。2、 第二部分为位图信息头BITMAPINFOHEADER,它也是一个结构,其定义如下:typedef struc tagBITMAPINFOHEADER DWORD biSize; LONG biWidth; LONG biH

5、eight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD biClrImportant;BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;该结构的长度也是固定的,为40个字节,各个域的说明如下: biSize:指定这个结构的长度,为40个字节。 biWidth:指定图像的宽度,单位是象素。

6、biHeight:指定图像的高度,单位是象素。 biPlanes:必须是1。 biBitCount:指定表示颜色时用到的位数,常用的值为1(黑白二色图)、4(16色图)、8(256色图)、24(真彩色图)。 biCompression:指定位图是否压缩,有效值为BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS。Windows位图可采用RLE4和RLE8的压缩格式,BI_RGB表示不压缩。 biSizeImage:指定实际的位图数据占用的字节数,可用以下的公式计算出来: biSizeImage = biWidth biHeight 要注意的是:上述公式中的biWidth必须

7、是4的整数倍(不是biWidth,而是大于或等于biWidth的离4最近的整数倍)。如果biCompression为BI_RGB,则该项可能为0。 biXPelsPerMeter:指定目标设备的水平分辨率。 biYPelsPerMeter:指定目标设备的垂直分辨率。 biClrUsed:指定本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的biBitCount次幂。 biClrImportant:指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色数都是重要的。3、 第三部分为调色板。有些位图需要调色板,有些位图,如真彩色图,不需要调色板,它们的BITMAPINFOHEADER后面

8、直接是位图数据。调色板实际上是一个数组,共有biClrUsed个元素(如果该值为0,则有2的biBitCount次幂个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:typedef struct tagRGBQUAD BYTE rgbBlue; BYTE rgbGreen; BYTE rgbRed; BYTE rgbReserved;RGBQUAD;其中: rgbBlue:该颜色的蓝色分量。 rgbGreen:该颜色的绿色分量。 rgbRed:该颜色的红色分量。 rgbReserved:保留值。4、 第四部分就是实际的图像数据。对于用到调色板的位图,图像数据就是该

9、象素颜色在调色板中的索引值,对于真彩色图,图像数据就是实际的R、G、B值。 对于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色灰度图

10、。2、实例代码BITMAPFILEHEADER bmfHdr; /定义文件头BITMAPINFOHEADER bmiHdr; /定义信息头RGBQUAD rgbQuad256; /定义调色板 /对信息头进行赋值bmiHdr.biSize = sizeof(BITMAPINFOHEADER);bmiHdr.biWidth = m_WidthOfModel;bmiHdr.biHeight = m_HeightOfModel;bmiHdr.biPlanes = 1;bmiHdr.biBitCount = 8;bmiHdr.biCompression = BI_RGB;bmiHdr.biSizeIma

11、ge = m_WidthOfModel*m_HeightOfModel;bmiHdr.biXPelsPerMeter = 0;bmiHdr.biYPelsPerMeter = 0;bmiHdr.biClrUsed = 0;bmiHdr.biClrImportant = 0; /对调色板进行赋值for(i=0; i256; i+)rgbQuadi.rgbBlue = (BYTE)i;rgbQuadi.rgbGreen = (BYTE)i;rgbQuadi.rgbRed = (BYTE)i;rgbQuadi.rgbReserved = 0; /对文件头进行赋值bmfHdr.bfType = (WO

12、RD)0x4D42;/;(WORD)(M8) | 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); /

13、保存文件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文件的结构进行了较为清晰的剖析,对

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 社会民生

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号