《MFC打开和保存一幅bmp图片--编程流程图.doc》由会员分享,可在线阅读,更多相关《MFC打开和保存一幅bmp图片--编程流程图.doc(7页珍藏版)》请在三一办公上搜索。
1、打开一幅图片1. 新建一个多文档的MFC应用程序.2. 在_Doc.h文件的C_Doc类中增加如下成员变量;public:int numquad; /调色板数int flagOpen; /标志是否打开bmpBITMAPINFO* pbi; /记录图像细节BYTE* lpbuf; /图像数据RGBQUAD* quad; /调色板BITMAPFILEHEADER bf;/文件头 BITMAPINFOHEADER bi; /信息头3. 修改”打开”菜单项的响应函数;a. 找到菜单资源b. 在”打开”菜单项建立类向导,页面设置如下:选择“Add function”,然后单击“Edit Code”编辑代
2、码如下:void CZhbDoc:OnFileOpen() / TODO: Add your command handler code hereLPCTSTR lpszFilter=BMP Files(*.bmp)|*.bmp|任何文件|*.*|;CFileDialog dlg(TRUE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);CString filepath;CFile file;/打开文件对话框if(dlg.DoModal()=IDOK)filepath=dlg.GetPathName();
3、if(file.Open(filepath,CFile:modeRead|CFile:shareDenyNone,NULL)=0)/读取文件失败AfxMessageBox(无法打开文件!,MB_OK,0);return;/读取文件头file.Read(&bf,sizeof(bf);/判断是否是BMP文件if(bf.bfType!=0x4d42)/BMAfxMessageBox(非BMP文件!,MB_OK,0);return;/判断文件是否损坏if(file.GetLength()!=bf.bfSize)AfxMessageBox(文件已损坏,请检查!,MB_OK,0);return;/读文件信
4、息头file.Read(&bi,sizeof(bi);/计算调色板数目numquad=0;if(bi.biBitCount24)numquad=1flagOpen=1) /这个函数显示DIBSetDIBitsToDevice(dc.m_hDC, /DIB将输出的设备描述表 0, /设备描述表中位图输出起始逻辑x地址 0, /设备描述表中位图输出起始逻辑x地址 pDoc-bi.biWidth, /DIB的宽度 pDoc-bi.biHeight, /DIB的高度 0, /DIB开始读取输出的像素数据的x位置 0, /DIB开始读取输出的像素数据的y位置 0, /DIB中像素的水平行号,它对应lpB
5、its存缓冲区第一行数据 pDoc-bi.biHeight, /DIB的行数,对应包含在由lpBits所指存缓冲区中的数据 pDoc-lpbuf, /包含像素数据的存缓冲区的指针 pDoc-pbi, /指向初始化了的BITMAPINFO数据结构的指针,描述了位图的大小和色彩数据 DIB_RGB_COLORS); /指定是显示的颜色 Invalidate(FALSE);/ Do not call CView:OnPaint() for painting messages保存一幅图片1.修改”另存为”菜单项的响应函数;a找到菜单资源b在”另存为”菜单项建立类向导,页面设置如下:选择“Add fun
6、ction”,然后单击“Edit Code”代码如下:void CZhbDoc:OnFileSaveAs() LPCTSTR lpszFilter=BMP Files(*.bmp)|*.bmp|任何文件|*.*|;CFileDialog dlg(FALSE,lpszFilter,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,lpszFilter,NULL);if (dlg.DoModal()!=IDOK)return;CFile file;CFileException fe;if (!file.Open(dlg.GetPathName(), CFile:m
7、odeCreate | CFile:modeReadWrite | CFile:shareExclusive, &fe) / 失败 ReportSaveLoadException(dlg.GetPathName(), &fe, TRUE, AFX_IDP_INVALID_FILENAME); return; file.SeekToBegin();file.Write(&bf,sizeof(bf);file.Write(&bi,sizeof(bi);if(numquad!=0)file.Write(quad,sizeof(RGBQUAD)*numquad);file.WriteHuge(lpbuf,bi.biSizeImage);file.Close();