MFC多文档中opencv处理图像打开、保存
2012-03-02 21:19
537 查看
需要在C**Doc和C**View中进行相应修改
图像打开:
Doc.cpp中:
图像保存:
1.Doc.cpp中
2.View.cpp中
整体代码如下:
图像打开:
Doc.cpp中:
BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename) { IplImage* pImg=NULL; pImg = cvLoadImage(csFilename,-1); // 读图像文件(DSCV) if (!pImg) return(false); cvFlip(pImg); // 与 DIB 像素结构一致 if (*pp) { cvReleaseImage(pp); } (*pp)=pImg; m_Display=0; return(true); }
BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName) { if(!CDocument::OnOpenDocument(lpszPathName)) return false; Load(&pImg,lpszPathName); if(pImg) return true; return false; }
图像保存:
1.Doc.cpp中
BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg) { int bl; cvFlip(pImg); // 恢复原 OpenCV 位图结构 bl=cvSaveImage(csFilename,pImg); // 图像存盘 return(bl); }
2.View.cpp中
void CCVMFCView::OnFileSaveAs()//图像保存 { CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存为(*.bmp)|*.bmp|所有文件(*.*)|*.*||"); CString strPath(""); if(dlg.DoModal()==IDOK) { cvFlip(workImg); strPath=dlg.GetPathName(); cvSaveImage(strPath,workImg); cvFlip(workImg); } }
整体代码如下:
// CVMFCDoc.h : CCVMFCDoc 类的接口 //@Author:ZrqSophia //@2012-3-2 #pragma once class CCVMFCDoc : public CDocument { protected: // 仅从序列化创建 CCVMFCDoc(); DECLARE_DYNCREATE(CCVMFCDoc) // 属性 public: // 操作 public: // 重写 public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); // 实现 public: virtual ~CCVMFCDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成的消息映射函数 protected: DECLARE_MESSAGE_MAP() public: IplImage* pImg; int m_Display; BOOL Load(IplImage** pp, LPCTSTR csFilename); BOOL Save(LPCTSTR csFilename, IplImage* pImg); BOOL OnOpenDocument(LPCTSTR lpszPathName); };
// CVMFCDoc.cpp : CCVMFCDoc 类的实现
//Author:ZrqSophia
//2012-3-2
#include "stdafx.h"
#include "CVMFC.h"
#include "CVMFCDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCVMFCDoc
IMPLEMENT_DYNCREATE(CCVMFCDoc, CDocument)
BEGIN_MESSAGE_MAP(CCVMFCDoc, CDocument)
END_MESSAGE_MAP()
// CCVMFCDoc 构造/析构
CCVMFCDoc::CCVMFCDoc()
: pImg(NULL)
, m_Display(0)
{
// TODO: 在此添加一次性构造代码
}
CCVMFCDoc::~CCVMFCDoc()
{
}
BOOL CCVMFCDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 在此添加重新初始化代码
// (SDI 文档将重用该文档)
return TRUE;
}
// CCVMFCDoc 序列化
void CCVMFCDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此添加存储代码
}
else
{
// TODO: 在此添加加载代码
}
}
// CCVMFCDoc 诊断
#ifdef _DEBUG
void CCVMFCDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CCVMFCDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// CCVMFCDoc 命令
BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename) { IplImage* pImg=NULL; pImg = cvLoadImage(csFilename,-1); // 读图像文件(DSCV) if (!pImg) return(false); cvFlip(pImg); // 与 DIB 像素结构一致 if (*pp) { cvReleaseImage(pp); } (*pp)=pImg; m_Display=0; return(true); }
BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg) { int bl; cvFlip(pImg); // 恢复原 OpenCV 位图结构 bl=cvSaveImage(csFilename,pImg); // 图像存盘 return(bl); }
BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName) { if(!CDocument::OnOpenDocument(lpszPathName)) return false; Load(&pImg,lpszPathName); if(pImg) return true; return false; }
// CVMFCView.h : CCVMFCView 类的接口 //@Author:Zrqsophia //@2012-3-2 #pragma once class CCVMFCView : public CScrollView { protected: // 仅从序列化创建 CCVMFCView(); DECLARE_DYNCREATE(CCVMFCView) // 属性 public: CCVMFCDoc* GetDocument() const; // 操作 public: // 重写 public: virtual void OnDraw(CDC* pDC); // 重写以绘制该视图 virtual BOOL PreCreateWindow(CREATESTRUCT& cs); protected: virtual BOOL OnPreparePrinting(CPrintInfo* pInfo); virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo); virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo); // 实现 public: virtual ~CCVMFCView(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: IplImage* saveImg; IplImage* workImg; LPBITMAPINFO m_lpBmi; int m_CaptFlag; int m_dibFlag; int m_SaveFlag; int m_ImageType; // 生成的消息映射函数 protected: afx_msg void OnFilePrintPreview(); afx_msg void OnRButtonUp(UINT nFlags, CPoint point); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); DECLARE_MESSAGE_MAP() public: virtual void OnInitialUpdate(); afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnFileSaveAs(); afx_msg void OnColorImageRefresh(); }; #ifndef _DEBUG // CVMFCView.cpp 中的调试版本 inline CCVMFCDoc* CCVMFCView::GetDocument() const { return reinterpret_cast<CCVMFCDoc*>(m_pDocument); } #endif
// CVMFCView.cpp : CCVMFCView 类的实现 //@Author:ZrqSophia //@2012-3-2 #include "stdafx.h" #include "CVMFC.h" #include "CVMFCDoc.h" #include "CVMFCView.h" #include "resource.h" #ifdef _DEBUG #define new DEBUG_NEW #endif // CCVMFCView IMPLEMENT_DYNCREATE(CCVMFCView, CScrollView) BEGIN_MESSAGE_MAP(CCVMFCView, CScrollView) // 标准打印命令 ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint) ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview) ON_WM_SIZE() ON_COMMAND(ID_FILE_S***E_AS, &CCVMFCView::OnFileSaveAs) ON_COMMAND(ID_COLOR_IMAGE_REFRESH, &CCVMFCView::OnColorImageRefresh) END_MESSAGE_MAP() // CCVMFCView 构造/析构 CFile fCapture; CFileException eCapture; char pbuf[20]; int captSetFlag=0; CCVMFCView::CCVMFCView() { // TODO: 在此处添加构造代码 saveImg = NULL; workImg = NULL; m_lpBmi = 0; m_CaptFlag = 0; m_dibFlag = 0; m_ImageType= 0; CSize sizeTotal; sizeTotal.cx = sizeTotal.cy = 100; SetScrollSizes(MM_TEXT, sizeTotal); } CCVMFCView::~CCVMFCView() { if (saveImg) cvReleaseImage(&saveImg); // 释放位图 if (workImg) cvReleaseImage(&workImg); if (m_lpBmi) free(m_lpBmi); // 释放位图信息 } BOOL CCVMFCView::PreCreateWindow(CREATESTRUCT& cs) { // TODO: 在此处通过修改 // CREATESTRUCT cs 来修改窗口类或样式 return CScrollView::PreCreateWindow(cs); } // CCVMFCView 绘制 void CCVMFCView::OnDraw(CDC* pDC) { CCVMFCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 if(pDoc->pImg) { if(pDoc->m_Display==0) { imageClone(pDoc->pImg,&saveImg); m_dibFlag=imageClone(saveImg,&workImg); m_ImageType=imageType(workImg); m_SaveFlag=m_ImageType; pDoc->m_Display=1; } } if (m_dibFlag) { // DIB 结构改变 if (m_lpBmi) free(m_lpBmi); m_lpBmi=CtreateMapInfo(workImg,m_dibFlag); m_dibFlag=0; CSize sizeTotal; sizeTotal=CSize(workImg->width,workImg->height); SetScrollSizes(MM_TEXT,sizeTotal); } char* pBits; if(workImg) pBits=workImg->imageData; if(workImg) StretchDIBits(pDC->m_hDC, 0,0,workImg->width,workImg->height, 0,0,workImg->width,workImg->height, pBits,m_lpBmi,DIB_RGB_COLORS,SRCCOPY); } // CCVMFCView 打印 void CCVMFCView::OnFilePrintPreview() { AFXPrintPreview(this); } BOOL CCVMFCView::OnPreparePrinting(CPrintInfo* pInfo) { // 默认准备 return DoPreparePrinting(pInfo); } void CCVMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加额外的打印前进行的初始化过程 } void CCVMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) { // TODO: 添加打印后进行的清理过程 } void CCVMFCView::OnRButtonUp(UINT nFlags, CPoint point) { ClientToScreen(&point); OnContextMenu(this, point); } void CCVMFCView::OnContextMenu(CWnd* pWnd, CPoint point) { theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); } // CCVMFCView 诊断 #ifdef _DEBUG void CCVMFCView::AssertValid() const { CScrollView::AssertValid(); } void CCVMFCView::Dump(CDumpContext& dc) const { CScrollView::Dump(dc); } CCVMFCDoc* CCVMFCView::GetDocument() const // 非调试版本是内联的 { ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCVMFCDoc))); return (CCVMFCDoc*)m_pDocument; } #endif //_DEBUG // CCVMFCView 消息处理程序 void CCVMFCView::OnInitialUpdate() { CScrollView::OnInitialUpdate(); CSize sizeTotal; // TODO: calculate the total size of this view sizeTotal.cx = sizeTotal.cy = 100; SetScrollSizes(MM_TEXT, sizeTotal); } void CCVMFCView::OnSize(UINT nType, int cx, int cy) { CScrollView::OnSize(nType, cx, cy); if (workImg) { // 刷新窗口画面 CSize sizeTotal; sizeTotal = CSize(workImg->width,workImg->height); SetScrollSizes(MM_TEXT, sizeTotal); // 设置滚动条 } } void CCVMFCView::OnFileSaveAs() { CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存为(*.bmp)|*.bmp|所有文件(*.*)|*.*||"); CString strPath(""); if(dlg.DoModal()==IDOK) { cvFlip(workImg); strPath=dlg.GetPathName(); cvSaveImage(strPath,workImg); cvFlip(workImg); } } void CCVMFCView::OnColorImageRefresh() { CCVMFCDoc* pDoc = GetDocument(); ASSERT_VALID(pDoc); pDoc->m_Display=0; Invalidate(); }
相关文章推荐
- MFC多文档中opencv处理图像打开、保存
- 基于mfc的数字图像处理的小软件pdd的诞生-打开图片及保存图片
- 在MFC中通过保存对话框保存opencv处理后图像
- 继承opencv的CImage类在MFC的单文档中编辑并显示图像
- 数字图像处理MFC程序设计之图像的打开显示
- opencv图像处理7-打开大图
- 图像的打开、修改、显示和保存示例(>OpenCV 2.0)
- Opencv (Opencv2)结合MFC学习数字图像处理【0】---开篇
- opencv图像处理7-打开大图
- python图像处理:打开、显示和保存
- OpenCV与MFC通用型图像处理开发实践
- 【OpenCV3图像处理】图像载入、显示、保存
- 继承opencv的CImage类在MFC的单文档中编辑并显示图像的方法
- Opencv (Opencv2)结合MFC学习数字图像处理---图片解码(3)
- 用python处理图片之打开\显示\保存图像的方法
- OpenCV学习笔记(8)VS2008 MFC下使用OpenCV2.0进行简单图像处理
- 【数字图像处理】 二.MFC单文档分割窗口显示图片
- OPENCV+MFC单文档显示图像的两种方法
- 内存或磁盘空间不足,Microsoft Office Excel 无法再次打开或保存任何文档 的处理方法
- 关于MFC中OpenCV图像处理使用cvFindContours引起的中断错误