MFC多文档中opencv处理图像打开、保存
需要在C**Doc和C**View中进行相应修改
图像打开:
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_SAVE_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();
- }
- //from: http://blog.csdn.net/abcjennifer/article/details/7313711
MFC多文档中opencv处理图像打开、保存的更多相关文章
- MFC 单文档中动态添加菜单项和响应菜单事件
新建一个单文档程序 在查看菜单项中增加两个子菜单,分别为隐藏工具栏(ID_HIDE),新建菜单(ID_NEWMENU) 在Resource.h中增加一个ID_NEWMENU宏 #define ID_N ...
- python实现解析markdown文档中的图片,并且保存到本地~
背景 前阵子简书好像说是凉了,搞得我有点小慌,毕竟我的大部分博客都是放在简书上面的,虽然简书提供了打包导出功能,但是只能导出文字,图片的话还是存在简书服务器上面,再加上我一直想要重新做一个个人博客,于 ...
- 使用Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)(转)
对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...
- 【python】使用HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies
一.从HTML文档中提取链接 模块HTMLParser,该模块使我们能够根据HTML文档中的标签来简洁.高效地解析HTML文档. 处理HTML文档的时候,我们常常需要从其中提取出所有的链接.使用HTM ...
- Python中的HTMLParser、cookielib抓取和解析网页、从HTML文档中提取链接、图像、文本、Cookies(二)
对搜索引擎.文件索引.文档转换.数据检索.站点备份或迁移等应用程序来说,经常用到对网页(即HTML文件)的解析处理.事实上,通过 Python语言提供的各种模块,我们无需借助Web服务器或者Web浏览 ...
- 【2016.3.30项目技术记录】]VS2010自动生成MFC单文档框架程序的修改:去除属性框,在CViewTree类中添加鼠标单击响应
转自http://blog.csdn.net/yanfeiouc2009/archive/2010/06/07/5653360.aspx 手头上有个东西要用到单文档,由于想省事,直接用VS2010做了 ...
- 如何使用免费PDF控件从PDF文档中提取文本和图片
如何使用免费PDF控件从PDF文档中提取文本和图片 概要 现在手头的项目有一个需求是从PDF文档中提取文本和图片,我以前也使用过像iTextSharp, PDFBox 这些免费的PD ...
- 文档生成工具doxygen+图像生成工具GraphViz
文档生成工具doxygen+图像生成工具GraphViz 虽然jdk自带的javadoc也很好用,不过使用doxygen+GraphViz 的组合可以生成许多强大的图(类图.协作图.文件包含/被包含图 ...
- Java解析word,获取文档中图片位置
前言(背景介绍): Apache POI是Apache基金会下一个开源的项目,用来处理office系列的文档,能够创建和解析word.excel.ppt格式的文档. 其中对word文档的处理有两个技术 ...
随机推荐
- Tools for Presention
ZoomIt v4.5 http://technet.microsoft.com/en-us/sysinternals/bb897434.aspx 微软的教师演示工具 主要有放大,画图,倒计时的功能. ...
- allegro生成光绘文件时,通过cam打开,*.drl钻孔文件不识别,为Unknow类型
生成钻孔文件时,NC_Parameters中,应该选Absolute
- Allegro中板子边框不封闭导致的z-copy无法用的问题
画一个不规则的边框,有半圆形状,导致边框不封闭,无法使用Z-COPY命令,下边是解决办法: 1 画好Outline后,选择 shape -> Compose Shape , options选项卡 ...
- Hive表分区
必须在表定义时创建partition a.单分区建表语句:create table day_table (id int, content string) partitioned by (dt stri ...
- return *this和return this的区别
别跟我说, return *this返回当前对象, return this返回当前对象的地址(指向当前对象的指针). 正确答案为:return *this返回的是当前对象的克隆(当然, 这里仅考虑返回 ...
- Notes of the scrum meeting(2013/10/27)
软工项目组buaa_smile确定自由项目主题及实现功能的scrum meeting meeting time:1:00~2:00p.m.,October 27th,2013 meeting plac ...
- 《C++Primer》复习——with C++11 [4]
考虑到STL的掌握主要靠的是练习,所以对于STL这部分,我把书中的练习都做一遍,加深印象.这些练习是第9.10.11.17章的,分别是顺序容器.泛型算法和关联容器等. ——10月22日 /*----- ...
- Reference in the manifest does not match the identity of the downloaded assembly
solution 1 :http://stackoverflow.com/questions/5337458/error-deploying-clickonce-application-referen ...
- Java多线程——<六>更方便的线程
一.概述 标题很抽象,什么叫更方便?更是相比谁来说的呢? 原来,我们定义任务,都是实现自Runnable或者Callable接口,但是这样必然需要你将新定义的任务附着给线程,然后再调用线程启动.在不考 ...
- 2014 Multi-University Training Contest 10
官方解题报告:http://blog.sina.com.cn/s/blog_6bddecdc0102v01l.html A simple brute force problem. http://acm ...