資源描述:
《MFC實(shí)現(xiàn)bmp圖片的打開和保存》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、鄭海波MFC編程總結(jié)2011‐10‐3北京打開一幅圖片1.新建一個多文檔的MFC應(yīng)用程序.2.在_Doc.h文件的C_Doc類中增加如下成員變量;public:intnumquad;//調(diào)色板數(shù)intflagOpen;//標(biāo)志是否打開bmpBITMAPINFO*pbi;//記錄圖像細(xì)節(jié)BYTE*lpbuf;//圖像數(shù)據(jù)RGBQUAD*quad;//調(diào)色板BITMAPFILEHEADERbf;//文件頭BITMAPINFOHEADERbi;//信息頭3.修改”打開”菜單項(xiàng)的響應(yīng)函數(shù);a.找到菜單資源b.在”打開”菜單項(xiàng)建立類向?qū)?,頁面設(shè)置
2、如下:選擇“Addfunction”,然后單擊“EditCode”第1頁鄭海波MFC編程總結(jié)2011‐10‐3北京編輯代碼如下:voidCZhbDoc::OnFileOpen(){//TODO:AddyourcommandhandlercodehereLPCTSTRlpszFilter="BMPFiles(*.bmp)
3、*.bmp
4、任何文件
5、*.*
6、
7、";CFileDialogdlg(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY
8、OFN_OVERWRITEPROMPT,lpszFilter,NULL);CS
9、tringfilepath;CFilefile;//打開文件對話框if(dlg.DoModal()==IDOK){filepath=dlg.GetPathName();if(file.Open(filepath,CFile::modeRead
10、CFile::shareDenyNone,NULL)==0){//讀取文件失敗AfxMessageBox("無法打開文件!",MB_OK,0);return;}//讀取文件頭file.Read(&bf,sizeof(bf));//判斷是否是BMP文件if(bf.bfType!=0x4d42)//'
11、BM'{AfxMessageBox("非BMP文件!",MB_OK,0);return;}//判斷文件是否損壞if(file.GetLength()!=bf.bfSize){AfxMessageBox("文件已損壞,請檢查!",MB_OK,0);return;}//讀文件信息頭file.Read(&bi,sizeof(bi));//計(jì)算調(diào)色板數(shù)目numquad=0;if(bi.biBitCount<24){numquad=1<12、i=(BITMAPINFO*)HeapAlloc(GetProcessHeap(),0,sizeof(BITMAPINFOHEADER)+numquad*sizeof(RGBQUAD));memcpy(pbi,&bi,sizeof(bi));quad=(RGBQUAD*)((BYTE*)pbi+sizeof(BITMAPINFOHEADER));//讀取調(diào)色板if(numquad!=0){file.Read(quad,sizeof(RGBQUAD)*numquad);}//為圖像數(shù)據(jù)申請空間bi.biSizeImage=bf.bfSiz
13、e‐bf.bfOffBits;lpbuf=(BYTE*)HeapAlloc(GetProcessHeap(),0,bi.biSizeImage);//讀取圖像數(shù)據(jù)file.Read(lpbuf,bi.biSizeImage);//圖像讀取完畢,關(guān)閉文件,設(shè)置標(biāo)志file.Close();flagOpen=1;}}4.在C_Veiw類中增加paint消息處理函數(shù);a.如下圖:第3頁鄭海波MFC編程總結(jié)2011‐10‐3北京點(diǎn)擊“addhandler”,然后再點(diǎn)“editexisting”c.在處理函數(shù)里編寫如下代碼:voidCZhbVie
14、w::OnPaint(){CPaintDCdc(this);//devicecontextforpainting//TODO:AddyourmessagehandlercodehereCZhbDoc*pDoc=GetDocument();//得到文檔指針,注意,文檔的命名是與工程名有關(guān)的!!不同的程序不一樣.ASSERT_VALID(pDoc);//是否已打開某個BMP文件if(pDoc‐>flagOpen==1){//這個函數(shù)顯示DIBSetDIBitsToDevice(dc.m_hDC,//DIB將輸出的設(shè)備描述表0,//設(shè)備描述表
15、中位圖輸出起始邏輯x地址0,//設(shè)備描述表中位圖輸出起始邏輯x地址pDoc‐>bi.biWidth,//DIB的寬度pDoc‐>bi.biHeight,//DIB的高度0,//DIB開始讀取輸出的像素數(shù)據(jù)的