郑海波 MFC编程总结 2011‐10‐3 北京
第 1页
打开一幅图片
1. 新建一个多文档的MFC应用程序.
2. 在_Doc.h文件的 C_Doc类中增加如下成员变量;
public:
int numquad; //调色板数
int flagOpen; //标志是否打开 bmp
BITMAPINFO* pbi; //记录图像细节
BYTE* lpbuf; //图像数据
RGBQUAD* quad; //调色板
BITMAPFILEHEADER bf;//文件头
BITMAPINFOHEADER bi; //信息头
3. 修改”打开”菜单项的响应函数;
a. 找到菜单资源
b. 在”打开”菜单项建立类向导,页面设置如下:
选择“Add function”,然后单击“Edit Code”
郑海波 MFC编程总结 2011‐10‐3 北京
第 2页
编辑代码如下:
void CZhbDoc::OnFileOpen()
{
// TODO: Add your command handler code here
LPCTSTR 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();
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)//'BM'
{
AfxMessageBox("非 BMP文件!",MB_OK,0);
return;
}
//判断文件是否损坏
if(file.GetLength()!=bf.bfSize)
{
AfxMessageBox("文件已损坏,请检查!",MB_OK,0);
return;
}
//读文件信息头
file.Read(&bi,sizeof(bi));
//计算调色板数目
numquad=0;
if(bi.biBitCount<24)
{
numquad=1<
工程
路基工程安全技术交底工程项目施工成本控制工程量增项单年度零星工程技术标正投影法基本原理
名有关的!!不同的程序不一样.
ASSERT_VALID(pDoc);
//是否已打开某个 BMP文件
if(pDoc‐>flagOpen==1)
{
//这个函数显示 DIB
SetDIBitsToDevice(dc.m_hDC, //DIB将输出的设备描述表
0, //设备描述表中位图输出起始逻辑 x地址
0, //设备描述表中位图输出起始逻辑 x地址
pDoc‐>bi.biWidth, //DIB的宽度
pDoc‐>bi.biHeight, //DIB的高度
0, //DIB开始读取输出的像素数据的 x位置
0, //DIB开始读取输出的像素数据的 y位置
0, //DIB中像素的水平行号,它对应 lpBits内存缓冲区第一行数据
郑海波 MFC编程总结 2011‐10‐3 北京
第 5页
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在”另存为”菜单项建立类向导,页面设置如下:
郑海波 MFC编程总结 2011‐10‐3 北京
第 6页
选择“Add function”,然后单击“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::modeCreate | 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);
}
郑海波 MFC编程总结 2011‐10‐3 北京
第 7页
file.WriteHuge(lpbuf,bi.biSizeImage);
file.Close();
}
后续开发函数的示例
void C__View::imageprocessing()
{
int i,j;
int width=bi.biWidth;
int height=bi.biHeight;
BYTE PixelFilter[800][800];
for(i=0;i
本文档为【MFC实现bmp图片的打开和保存】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。