您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 酒店餐饮 > VC6.0下bmp位图的读取与显示
昆明理工大学(数字图像处理)实验报告实验名称:VC6.0下bmp位图的读取与显示一、实验目的:掌握windowsBMP格式位图文件的基本格式。会使用VC++读取图像数据并显示。二、实验内容:1、在VC6.0环境下,生成MFC应用程序框架。2、在已生成的应用程序中,加BMP位图读取与显示的代码,从已有文件中读取bmp格式文件并在视图中显示。三、实验原理及步骤:基本知识:BMP位图文件格式BMP位图文件中主要由4部分内容组成:1、文件头BITMAPFILEHEADER为一STRUCTURE:typedefstructtagBITMAPFILEHEADER{WORDbfType;//文件类型,必须为“BM”或0x424dDWORDbfSize;//文件大小WORDbfReserved1;//保留WORDbfReserved2;//保留DWORDbfOffBits;//从文件头到实际位图数据的偏移字节数}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;2、位图信息头BITMAPINFOHEADER,定义如下:typedefstructtagBITMAPINFOHEADER{DWORDbiSize;//structuresizeLONGbiWidth;//imagewidthLONGbiHeight;//imageheightWORDbiPlanes;//valueis1WORDbiBitCount;//colorbitsDWORDbiCompression;//compressionornotDWORDbiSizeImage;//Imagesize=width*height(其中width必须为4的倍数。LONGbiXPelsPerMeter;//LONGbiYPelsPerMeter;DWORDbiClrUsed;//DWORDbiClrImportant;}BITMAPINFOHEADER,FAR*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;3、调色板typedefstructtagRGBQUAD{BYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgbReserved;}RGBQUAD;用于存放图像的颜色。4、图像的实际数据。对于2色图,用1位表示像素的值。对于16色图,用4位表示像素的值。对于256色图,一个字节刚好表示1个像素。对于用到调色板的位图,图像数据就是该像素颜色在调色板中索引值,对于真彩色,不用调色板,三个字节的数据分别代表图像的B、G、R。实验步骤:1、生成一名为Gsm的基于MFC的应用程序框架:选择file菜单new选项,在打开的窗口中选择project选项,选中MFCAppWizard(exe)。并在projectname输入Gsm,选择存放project的位置。如下图所示。选择确定,进入下一步。选择singledocument,并在最后CdipView类的基类中选择CscrollView,使应用程序视图具有滚动条。2、在应用程序中加入具体的函数和变量。在ClassView中选择CGsmView单击右键选择添加成员变量,加入下列变量:public:intm_x;HBITMAPm_Bmp;LPVOIDm_ColorList;LPBYTEm_Image;LPBITMAPINFOHEADERm_DibHead;enumallocate{None,crtallocate,heapallocate};allocatem_nBmpallocate;allocatem_nImageallocate;DWORDm_ImageSize;intm_nPalette;HANDLEm_hFile;HANDLEm_hMap;LPVOIDm_lpvFile;HPALETTEm_hPalette;HGLOBALm_hGlob;在ClassView中选择CGsmView单击右键选择添加成员函数,把下列函数加入到C++View类中voidSetPaletteSize(intnBitCount);voidClear();BOOLReadFile(CFile*pFile);BOOLSetPalette();BOOLGetPalette();BOOLDibToDC(CDC*pDC,CSizesize);BOOLMemToDib(LPVOIDlmem);CSizeGetDibSize();3、把对应函数代码拷贝到新的函数中;voidCGsmView::SetPaletteSize(intnBitCount){if(m_DibHead-biSize!=sizeof(BITMAPINFOHEADER)){thrownewCException;}m_ImageSize=m_DibHead-biSizeImage;if(m_ImageSize==0){DWORDdwBytes=((DWORD)m_DibHead-biWidth*m_DibHead-biBitCount)/32;if(((DWORD)m_DibHead-biWidth*m_DibHead-biBitCount)%32){dwBytes++;}dwBytes*=4;m_ImageSize=dwBytes*m_DibHead-biHeight;}m_ColorList=(LPBYTE)m_DibHead+sizeof(BITMAPINFOHEADER);if((m_DibHead==NULL)||(m_DibHead-biClrUsed==0)){switch(nBitCount){case1:m_nPalette=2;break;case4:m_nPalette=16;break;case8:m_nPalette=256;break;case16:case24:case32:m_nPalette=0;break;default:ASSERT(FALSE);}}else{m_nPalette=m_DibHead-biClrUsed;}ASSERT((m_nPalette=0)&&(m_nPalette=256));}voidCGsmView::Clear(){if(m_hFile==NULL)return;::UnmapViewOfFile(m_lpvFile);::CloseHandle(m_hMap);::CloseHandle(m_hFile);m_hFile=NULL;if(m_nBmpallocate==crtallocate){delete[]m_DibHead;}elseif(m_nBmpallocate==heapallocate){::GlobalUnlock(m_hGlob);::GlobalFree(m_hGlob);}if(m_nImageallocate==crtallocate)delete[]m_Image;if(m_hPalette!=NULL)::DeleteObject(m_hPalette);if(m_Bmp!=NULL)::DeleteObject(m_Bmp);m_nBmpallocate=m_nImageallocate=None;m_hGlob=NULL;m_DibHead=NULL;m_Image=NULL;m_ColorList=NULL;m_nPalette=0;m_ImageSize=0;m_lpvFile=NULL;m_hMap=NULL;m_hFile=NULL;m_Bmp=NULL;m_hPalette=NULL;}BOOLCGsmView::ReadFile(CFile*pFile){intnCount,nSize;BITMAPFILEHEADERbmfh;Clear();try{nCount=pFile-Read((LPVOID)&bmfh,sizeof(BITMAPFILEHEADER));if(nCount!=sizeof(BITMAPFILEHEADER)){thrownewCException;}if(bmfh.bfType!=0x4d42){thrownewCException;}nSize=bmfh.bfOffBits-sizeof(BITMAPFILEHEADER);m_DibHead=(LPBITMAPINFOHEADER)newchar[nSize];m_nBmpallocate=m_nImageallocate=crtallocate;nCount=pFile-Read(m_DibHead,nSize);SetPaletteSize(m_DibHead-biBitCount);GetPalette();m_Image=(LPBYTE)newchar[m_ImageSize];nCount=pFile-Read(m_Image,m_ImageSize);}catch(CException*tmpc){AfxMessageBox(文件读取错误);tmpc-Delete();returnFALSE;}returnTRUE;}BOOLCGsmView::SetPalette(){if(m_nPalette!=0)returnFALSE;CClientDCdc(this);CDC*pDC=&dc;m_hPalette=::CreateHalftonePalette(pDC-GetSafeHdc());returnTRUE;}BOOLCGsmView::GetPalette(){if(m_nPalette==0)returnFALSE;if(m_hPalette!=NULL)::DeleteObject(m_hPalette);LPLOGPALETTEpTempPalette=(LPLOGPALETTE)newchar[2*sizeof(WORD)+m_nPalette*sizeof(PALETTEENTRY)];pTempPalette-palVersion=0x30;pTempPalette-palNumEntries=m_nPalette;LPRGBQUADpRGBQuad=(LPRGBQUAD)m_ColorList;for(inti=0;im_nPalette;i++){pTempPalette-palPalEntry[i].peRed=pRGBQuad-rgbRed;pTempPalette-palPalEntry[i].peGreen=pRGBQuad-rgbGreen;pTempPalette-palPalEntry[i].peBlue=pRGBQuad-rgbBlue;pTempPalette-palPalEntry[i].peFlags=0;pRGBQuad++;}m_hPalette=::CreatePalette(pTempPalette);deletepTempPalette;returnTRUE;}BOOLCGsmView::DibToDC(CDC*pDC,CSizesize){if(m_DibHead==NULL)returnFALSE;if(m_hPalette!=NULL){HDChdc=pDC-GetSafeHdc();::SelectPalette(hdc,m_hPalette,TRUE);}pDC-SetStretchBltMode(COLORONCOLOR);::StretchDIBits(pDC-GetSafeHdc(),0,0,size.cx,size.cy,0,0,m_DibHead-biWidth,m_DibHead-biHeight,m_Image,(LPBITMAPINFO)m_DibHead,DIB_RGB_COLORS,SRCCOPY);returnTRUE;}BOOLCGsmView::MemToDib(LPVOIDlmem){Clear();m_DibHe
本文标题:VC6.0下bmp位图的读取与显示
链接地址:https://www.777doc.com/doc-1839415 .html