
基于VC++6.0的BMP图像显示.docx
6页基于VC++6.0的BMP图像显示 摘要:探讨了VC++6.0环境下BMP图像文件的显示首先详细介绍BMP图像文件的两种类型DDB和DIB的各部分组成及其意义,并对DIB的两种形式Windows DIB和OS/2 DIB加以区别,然后利用VC++6.0的MFC库函数对DDB位图的显示加以实现,对DIB位图的显示过程以程序流程图的形式详细说明论文关键词:BMP图像,VC++6.0,图像显示,DDB位图,DIB位图位图分为设备相关位图(DDB)和设备无关位图(DIB)两种1 DDB位图DDB是一种内部位图格式,自身没有调色板,它的显示依赖于计算机显示系统内部的调色板,因此它的显示效果因计算机显示系统的不同而不同1.1 BITMAP结构BITMAP结构定义了DDB位图的类型、宽度、颜色格式和像素位值信息,该结构的定义如下:typedef struct tagBITMAP{int bmType; //指定位图的类型,这个值必须为0int bmWidth; //指定位图的宽度,以像素为单位int bmHeight; //指定位图的高度,以像素为单位int bmWidthBytes; //指定位图中每个扫描行的字节数BYTE bmPlanes; //指定颜色层数BYTE bmBitsPixel; //指定每个像素所占的位数viod FAR* bmBits; //存放像素值的内存块的地址} BITMAP,*PBITMAP1.2 DDB位图的显示显示DDB位图的基本过程为:首先创建一个位图对象,并将该位图对象装入内存;然后创建一个与显示设备上下文相兼容的内存设备上下文(CDC);再将该位图对象选入创建的内存设备上下文,并保存内存设备上下文中原有位图的指针;接着显示位图;最后恢复设备上下文中原有的位图。
函数DisplayDDB展示了DDB位图的显示过程BOOL DisplayDDB(CDC* pDC,LPCSTR lpszBitmap){CBitmap Bitmap,*poldBitmap;BITMAP bmp;CDC dcMemory;if(!Bitmap.LoadBitmap(lpszBitmap)) //加载位图{ return FALSE;}if(!dcMemory.CreateCompatibleDC(pDC)) //创建CDCreturn FALSE;//创建CDC失败//把创建的位图选入CDCpoldBitmap=(CBitmap*)dcMemory.SelectObject(&Bitmap);//显示位图pDC->BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,&dcMemory,0,0,SRCCOPY);//把原始位图选入CDCdcMemory.SelectObject(poldBitmap);return TRUE;}2 DIB位图DIB位图是设备无关位图,它自带调色板信息,经常存储为以BMP为后缀的图像DIB分为Windows DIB和OS/2 DIB两种。
2.1 Windows DIBWindows DIB由BITMAPFILEHEADER(位图文件头)、BITMAPINFOHEADER(位图信息头)、RGBQUAD(位图颜色表)和位图图像数据四部分组成位图文件头BITMAPFILEHEADER的定义如下:typedef struct tagMAPFILEHEADER{WORD bfType; 指定文件的类型,必须是BMDWORD bfSize; 指定位图文件的大小,以字节为单位WORD bfReserved1; 保留位,必须为0WORD bfReserved2; 保留位,必须为0DWORD bfOffBits; 从BITMAPFILEHEADER结构到位图数据的偏移量(字节)} BITMAPFILEHEADER,FAR *LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;位图信息头BITMAPFILEHEADER结构的定义如下:typedef struct tagBITMAPINFOHEADER{DWORD biSize; //指定这个结构的大小,以字节为单位LONG biWidthbiWidth; //指定位图的宽度,以像素为单位LONG biHeight; //指定位图的高度,以像素为单位WORD biPlanes; //该值必须为1WORD biBitCount; //指定每个像素所占的位数DWORD biCompression; //指定位图的压缩类型DWORD biSizeImage; //指定位图数据占用的字节数,biSizeImage=biWidth’biHeight,其中biWidth’必须是4的整数倍,biWidth’的计算方法为:((biWidth)+31)/32*4LONG biXPelsPerMeter; //指定位图目标设备的水平分辨率(像素/米)LONG biYPelsPerMeter; //指定位图目标设备的垂直分辨率(像素/米)DWORD biClrUsed; //指定显示位图所用到的颜色数目,如果这个值为0,需要所有的颜色。
DWORD biClrImportant; //指定显示位图所用到的颜色数目,如果这个值为0,需要所有的颜色} BITMAPINFOHEADER, *PBITMAPINFOHEADER;有的位图显示需要调色板,有的不需要不需要调色板的位图的BITMAPINFOHEADER后直接是位图的数据调色板是一个由biClrUsed个元素组成的数组(如果biClrUsed=0,则有2的biBitCount次幂个元素)数组中每个元素都是一个RGBQUAD结构,RGBQUAD结构的定义如下:typedef struct tagRGBQUAD{BYTE rgbBlue; //指定该颜色的蓝色分量BYTE rgbGreen; //指定该颜色的绿色分量BYTE rgbRed; //指定该颜色的红色分量BYTE rgbReserved; //保留值,必须为0} RGBQUAD;位图信息头和调色板组成了位图信息(BITMAPINFO)结构,BITMAPINFO结构的定义如下:typedef struct tagBITMAPINFO{BITMAPINFOHEADER bmiHeader;RGBQUAD bmiColors[1];} BITMAPINFO, *PBITMAPINFO;最后一部分是实际图像的数据,对于调用调色板的位图,图像的数据就是该像素在调色板中的索引值,对于真彩色的位图,图像的数据就是实际的R、G、B的值。
2.2 OS/2 DIBOS/2 DIB与Windows DIB数据的存储方式是一样的,只在位图信息结构(信息头和调色板)有所不同OS/2 DIB中的BITMAPCOREINFO、BITMAPCOREHEADER和RGBTRIPLE分别与Windows DIB的BITMAPINFO、BITMAPINFOHEADER和RGBGUAD相对应BITMAPCOREHEADER结构的定义如下:typedef struct tagBITMAPCOREHEADER{DWORD bcSize; 指定这个结构的大小,以字节为单位WORD bcWidth; 指定改位图的宽度,以像素为单位WORD bcHeight; 指定改位图的高度,以像素为单位WORD bcPlanes; 该值必须为1WORD bcBitCount; 指定每个像素所需的字节数} BITMAPCOREHEADER, *PBITMAPCOREHEADER;RGBTRIPLE结构的定义如下:typedef struct tagRGBTRIPLE{BYTE rgbtBlue; //该颜色的蓝色分量BYTE rgbtGreen; //该颜色的蓝色分量BYTE rgbtRed; //该颜色的蓝色分量} RGBTRIPLE;BITMAPCOREINFO结构的定义如下:typedef struct _BITMAPCOREINFO{BITMAPCOREHEADER bmciHeader;RGBTRIPLE bmciColors[1];} BITMAPCOREINFO, *PBITMAPCOREINFO;Windows DIB和OS/2 DIB的信息头结构大小不同,可以以此来判断DIB为Windows DIB或OS/2 DIB。
2.3 显示DIB位图显示DIB位图和创建DIB位图的调色板的程序流程图如图2-2所示:图2-1显示DIB位图程序流程图 图2-2创建调色板程序流程图3、结论显示BMP格式的位图首先要清楚其组成和各组成的具体含义,显示位图时首先要打开要显示的位图的文件,读取位图数据,然后为位图创建调色板,并将创建的调色板选入设备上下文,然后显示位图,位图显示完后在程序结束之前要恢复程序原始调色板参考文献[1]周长发.精通VisualC++图像处理编程.电子工业出版社.2006.6[2]何斌,马天予. VisualC++图像处理. 人民邮电出版社.2002.12[3]潘爱民,王国印.Visual C++技术内幕.清华大学出版社.2009.4[4]陈兵旗,孙明.Visual C++使用图形处理.清华大学出版社.3004.3[5]高伟卫,杨胜强.基于VC基础类库的图像显示.机械管理开发,2005(6),84-87-全文完-。
