MFC对话框打开一幅图片并在picture显示和图片保存

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

学了MFC一段时间后,试着要用对话框打开一幅bmp图像并保存,结果发现网上这些资料太少了,而且有的也讲不清,讲不全,所以自己磕磕碰碰捣鼓了好久,期间也谢谢各位大神的指导,现在我终于完成,特意写出来与大家分享,各位菜鸟共勉。一、首先要先了解bmp位图结构可以去看看,内容不多但是够看,也容易懂二、了解位图的显示函数SetStretchBltMode()StretchDIBits()具体函数介绍自己百度一下,我就不多说了三、开始做啦1、新建一个MFC对话框文档默认其他设置,点击完成后会出现这个界面在按钮上单击鼠标右键,在弹出的列表中选择属性把标题改为读取图片再添加一个按钮,把ID改为IDC_SAVE,标题改为保存图片在控件中选择图像,然后在对话框画一个大小适宜的矩形框,在选中对话框点击右键,选择属性,把ID改为IDC_PICTURE回到对话框界面,双击读取图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了先把CDialog::OnOK();注释起来,这个是点击按钮后对话框就会关闭的函数然后在//CDialog::OnOK();下面添加以下代码代码都有注释,不懂的地方可以自己再百度//CFileDialog为VC中打开文件对话框类BITMAPFILEHEADERbmpHeader;//文件头BITMAPINFOHEADERbmpInfo;//信息头CFileDialogdlg(TRUE,*.BMP,NULL,NULL,位图文件(*.BMP)|*.bmp;*.BMP|,this);CFilebmpFile;//记录打开文件CStringstrFileName;//记录选择文件路径if(!dlg.DoModal()==IDOK)return;strFileName=dlg.GetPathName();//以只读的方式打开文件if(!bmpFile.Open(strFileName,CFile::modeRead|CFile::typeBinary))return;if(bmpFile.Read(&bmpHeader,sizeof(BITMAPFILEHEADER))!=sizeof(BITMAPFILEHEADER)){AfxMessageBox(readbmpheaderfailed!);return;}if(bmpHeader.bfType!=0x4d42){AfxMessageBox(invalidfiletype!);return;}if(bmpFile.Read(&bmpInfo,sizeof(BITMAPINFOHEADER))!=sizeof(BITMAPINFOHEADER)){AfxMessageBox(readbmpinforheaderfailed!);return;}if(bmpInfo.biBitCount!=24){AfxMessageBox(Fileisnot24bit.Applicationdoesn'tsupportthiskindoffile!);return;}pBmpInfo=(BITMAPINFO*)newchar[sizeof(BITMAPINFOHEADER)];if(!pBmpInfo){AfxMessageBox(memoryerror!);return;}//为图像数据申请空间memcpy(pBmpInfo,&bmpInfo,sizeof(BITMAPINFOHEADER));DWORDdataBytes=bmpHeader.bfSize-bmpHeader.bfOffBits;pBmpData=(BYTE*)newchar[dataBytes];if(!pBmpData){AfxMessageBox(memoryerror!);deletepBmpData;return;}if(bmpFile.Read(pBmpData,dataBytes)!=dataBytes){AfxMessageBox(Readbmpdatafailed!);deletepBmpInfo;deletepBmpData;return;}bmpFile.Close();CWnd*pWnd=GetDlgItem(IDC_PICTURE);//获得pictrue控件窗口的句柄CRectrect;pWnd-GetClientRect(&rect);//获得pictrue控件所在的矩形区域CDC*pDC=pWnd-GetDC();//获得pictrue控件的DC//显示图片pDC-SetStretchBltMode(COLORONCOLOR);StretchDIBits(pDC-GetSafeHdc(),0,0,rect.Width(),rect.Height(),0,0,bmpInfo.biWidth,bmpInfo.biHeight,pBmpData,pBmpInfo,DIB_RGB_COLORS,SRCCOPY);iBmpWidth=bmpInfo.biWidth;iBmpHeight=bmpInfo.biHeight;然后在这个.cpp文件头处添加BITMAPINFO*pBmpInfo;//记录图像细节BYTE*pBmpData;//图像数据intiBmpWidth;//输入的宽度,以像素为单位intiBmpHeight;//输入的高度,以像素为单位这些是全局变量,主要是为了后面图像保存可以用的再回到对话框界面,双击保存图片按钮,这时会弹出一个对话框,点确定然后就会跳到关联函数这边了在//TODO:Addyourcontrolnotificationhandlercodehere下添加下面这些代码BITMAPFILEHEADERbmpf;//文件头BITMAPINFOHEADERbmpi;//信息头intWidthbytes;CFilebmpFile;CStringstrFileName;CFileDialogdlg(FALSE,*.BMP,NULL,NULL,位图文件(*.BMP)|*.bmp;*.BMP|);if(!dlg.DoModal()==IDC_SAVE)return;strFileName=dlg.GetPathName();if(bmpFile.Open(strFileName,CFile::modeCreate|CFile::modeReadWrite)==0)return;Widthbytes=(iBmpWidth*3+3)/4*4;//位图对齐,确保为4的倍数/*BITMAPFILEHEADER结构填写*/bmpf.bfType=0x4d42;bmpf.bfOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);bmpf.bfSize=bmpf.bfOffBits+Widthbytes*iBmpHeight;bmpf.bfReserved1=0;bmpf.bfReserved2=0;/*BITMAPINFOHEADER结构填写*/bmpi.biSize=sizeof(BITMAPINFOHEADER);bmpi.biWidth=iBmpWidth;bmpi.biHeight=iBmpHeight;bmpi.biPlanes=1;bmpi.biBitCount=24;//24位bmpi.biCompression=BI_RGB;bmpi.biSizeImage=0;bmpi.biXPelsPerMeter=0;bmpi.biYPelsPerMeter=0;bmpi.biClrUsed=0;bmpi.biClrImportant=0;bmpFile.Write(&bmpf,sizeof(bmpf));//写文件头;bmpFile.Write(&bmpi,sizeof(bmpi));//写信息头;bmpFile.Write(pBmpData,Widthbytes*iBmpHeight);//写图像数据信息;bmpFile.Close();OK全部完成了,编译运行一下,点击打开图片按钮就能显示图片了呵呵,写得不够专业,还望大家不吝赐教

1 / 7
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功