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文档的处理有两个技术 ...
随机推荐
- eclipse增加浏览器chrome
1.安装完了google chrome游览器后,如何让eclipse直接用chrome打开jsp 2.添加到eclipse环境中即可, Window(菜单) -- preferences 增加成功后, ...
- Linux 挂载2T以上存储
在生产环境中,我们会遇到分区大于2T的磁盘(比如:添加一个3TB的存储),由于MBR分区表只支持2T磁盘,所以大于2T的磁盘必须使用GPT分区表 而fdisk是不支持GPT分区的,我们可以使用part ...
- 【转载】MySQL 日志 undo | redo
本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版 ...
- [SQL_Server_Question]Msg 1105无法为数据库 'tempdb' 中的对象分配空间,因为 'PRIMARY' 文件组已满
错误消息: Msg 1105, Level 17, State 2, Line 266Could not allocate space for object 'dbo.Large Object Sto ...
- java_Thread生产者与消费者 Demo
package com.bjsxt.Thread.Demo; public class ProducerConsumer { /** * 生产者与消费者 * @param args */ public ...
- js 截取某个字符前面或者后面的字符串
/* string 字符串; str 指定字符; split(),用于把一个字符串分割成字符串数组; split(str)[0],读取数组中索引为0的值(第一个值),所有数组索引默认从0开始; */ ...
- ZOJ 3229 有上下界最大流
1: /** 2: ZOJ 3229 有上下界的最大流 3: 两次求最大流的过程,非二分 4: 有源汇上下界的最大流问题, 首先连接 sink -> src, [0,INF]. 5: 根据net ...
- UML 小结(5)- 图解 Rational Rose 的详细安装过程
在学习UML的时候,会用到画图工具:Rotional Rose . 原以为这款软件直接下载下来或者跟朋友那边拷过来就可以直接用了,结果却是没有那么简单,如果读者您也是为了解决这个家伙的安装问题的话,那 ...
- Careercup - Facebook面试题 - 5188884744896512
2014-05-02 07:18 题目链接 原题: boolean isBST(const Node* node) { // return true iff the tree with root 'n ...
- 推荐acm题目
杭电 http://acm.hdu.edu.cn/onlineuser.php. 浙大 http://acm.zju.edu.cn/onlinejudge/submit.do?problemId= ...