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

上传人:mg****85 文档编号:34276107 上传时间:2018-02-22 格式:DOC 页数:4 大小:59.50KB
返回 下载 相关 举报
一个将图像数据保存为bmp文件的实例_第1页
第1页 / 共4页
一个将图像数据保存为bmp文件的实例_第2页
第2页 / 共4页
一个将图像数据保存为bmp文件的实例_第3页
第3页 / 共4页
一个将图像数据保存为bmp文件的实例_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

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

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

2、一个 BMP 文件大体上分成如下 4 个部分,如图 1 所示。王军伟,在读博士研究生,中国农业大学(东区)214#信箱,研究方向:图像处理,智能交通1、 第一部分为位图文件头 BITMAPFILEHEADER,它是一个结构,其定义如下:typedef struc tagBITMAPFILEHEADERWORD bfType;WORD bfSize;BITMAPFILEHEADER位图文件头(只用于 BMP 文件 )bfType = “BM” bfSize bfReserved1 bfReserved2 bfOffBits BITMAPINFOHEADER位图信息头biSize biWidth

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

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

5、 tagBITMAPINFOHEADERDWORD 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 个字节,各个域的说明如下:

6、biSize:指定这个结构的长度,为 40 个字节。 biWidth:指定图像的宽度,单位是象素。 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:指定实际的位图数据占用的字节数,可用以下的公

7、式计算出来:biSizeImage = biWidth biHeight要注意的是:上述公式中的 biWidth必须是 4 的整数倍(不是 biWidth,而是大于或等于biWidth 的离 4 最近的整数倍)。如果 biCompression 为 BI_RGB,则该项可能为 0。 biXPelsPerMeter:指定目标设备的水平分辨率。 biYPelsPerMeter:指定目标设备的垂直分辨率。 biClrUsed:指定本图像实际用到的颜色数,如果该值为 0,则用到的颜色数为 2 的biBitCount 次幂。 biClrImportant:指定本图像中重要的颜色数,如果该值为 0,则认为

8、所有的颜色数都是重要的。3、 第三部分为调色板。有些位图需要调色板,有些位图,如真彩色图,不需要调色板,它们的 BITMAPINFOHEADER 后面直接是位图数据。调色板实际上是一个数组,共有 biClrUsed 个元素(如果该值为 0,则有 2 的 biBitCount 次幂个元素)。数组中每个元素的类型是一个 RGBQUAD 结构,占 4 个字节,其定义如下:typedef struct tagRGBQUADBYTE rgbBlue;BYTE rgbGreen;BYTE rgbRed;BYTE rgbReserved;RGBQUAD;其中: rgbBlue:该颜色的蓝色分量。 rgbGr

9、een:该颜色的绿色分量。 rgbRed:该颜色的红色分量。 rgbReserved:保留值。4、 第四部分就是实际的图像数据。对于用到调色板的位图,图像数据就是该象素颜色在调色板中的索引值,对于真彩色图,图像数据就是实际的 R、G、B 值。 对于 2 色图,用 1 位就可以表示该象素的颜色,所以 1 个字节可以表示 8 个象素。 对于 16 色图,用 4 位可以表示一个象素的颜色,所以 1 个字节可以表示 2 个象素。 对于 256 色图,1 个字节刚好可以表示 1 个象素。 对于真彩色图,3 个字节才能表示 1 个象素。二、保存实例1、 图像数据图像数据来源于图像采集卡所采集的图像的一部分

10、,保存在一 Buffer 中(char *lp1),图像高度为110 个象素(保存在变量 int m_Width 中),宽度为 228 个象素(保存在变量 int m_Height 中,并且是 4 的整倍数),图像为一 256 色灰度图。2、实例代码BITMAPFILEHEADER bmfHdr; /定义文件头BITMAPINFOHEADER bmiHdr; /定义信息头RGBQUAD rgbQuad256; /定义调色板/对信息头进行赋值bmiHdr.biSize = sizeof(BITMAPINFOHEADER);bmiHdr.biWidth = m_WidthOfModel;bmiHd

11、r.biHeight = m_HeightOfModel;bmiHdr.biPlanes = 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; i256; i+)rgbQuadi.rgbBlue =

12、(BYTE)i;rgbQuadi.rgbGreen = (BYTE)i;rgbQuadi.rgbRed = (BYTE)i;rgbQuadi.rgbReserved = 0;/对文件头进行赋值bmfHdr.bfType = (WORD)0x4D42;/;(WORD)(M8) | B)bmfHdr.bfSize=(DWORD)(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD)*256 + m_WidthOfModel*m_HeightOfModel);bmfHdr.bfReserved1 = 0;bmfHdr.

13、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) /写文件头fp.Write(LPSTR) /写信息头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 环境下调试通过。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 生活休闲 > 科普知识

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