代码改变世界

MFC多文档中opencv处理图像打开、保存

2016-04-10 14:15  GarfieldEr007  阅读(1103)  评论(0编辑  收藏  举报

需要在C**Doc和C**View中进行相应修改

 

图像打开:

Doc.cpp中:

 

[cpp] view plain copy
 
  1. BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename)  
  2. {  
  3.     IplImage* pImg=NULL;  
  4.   
  5.     pImg = cvLoadImage(csFilename,-1);      //  读图像文件(DSCV)  
  6.     if (!pImg) return(false);  
  7.     cvFlip(pImg);                           //  与 DIB 像素结构一致  
  8.     if (*pp) {  
  9.         cvReleaseImage(pp);  
  10.     }  
  11.     (*pp)=pImg;  
  12.     m_Display=0;  
  13.     return(true);  
  14. }  

 

[cpp] view plain copy
 
  1. BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)  
  2. {  
  3.     if(!CDocument::OnOpenDocument(lpszPathName))    return false;  
  4.     Load(&pImg,lpszPathName);  
  5.     if(pImg) return true;  
  6.     return false;  
  7. }  


图像保存:

 

 

1.Doc.cpp中

 

[cpp] view plain copy
 
  1. BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg)  
  2. {  
  3.     int   bl;  
  4.     cvFlip(pImg);                           //  恢复原 OpenCV 位图结构  
  5.     bl=cvSaveImage(csFilename,pImg);        //  图像存盘  
  6.     return(bl);  
  7. }  

 

2.View.cpp中

 

 

[cpp] view plain copy
 
  1. void CCVMFCView::OnFileSaveAs()//图像保存  
  2. {  
  3.     CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存为(*.bmp)|*.bmp|所有文件(*.*)|*.*||");  
  4.     CString strPath("");  
  5.     if(dlg.DoModal()==IDOK)  
  6.     {  
  7.         cvFlip(workImg);  
  8.         strPath=dlg.GetPathName();  
  9.         cvSaveImage(strPath,workImg);  
  10.         cvFlip(workImg);  
  11.     }  
  12. }  



 

 

 

整体代码如下:

 

 

[cpp] view plain copy
 
  1. // CVMFCDoc.h : CCVMFCDoc 类的接口  
  2. //@Author:ZrqSophia  
  3. //@2012-3-2  
  4.   
  5.   
  6. #pragma once  
  7.   
  8.   
  9. class CCVMFCDoc : public CDocument  
  10. {  
  11. protected: // 仅从序列化创建  
  12.     CCVMFCDoc();  
  13.     DECLARE_DYNCREATE(CCVMFCDoc)  
  14.   
  15. // 属性  
  16. public:  
  17.   
  18. // 操作  
  19. public:  
  20.   
  21. // 重写  
  22. public:  
  23.     virtual BOOL OnNewDocument();  
  24.     virtual void Serialize(CArchive& ar);  
  25.   
  26. // 实现  
  27. public:  
  28.     virtual ~CCVMFCDoc();  
  29. #ifdef _DEBUG  
  30.     virtual void AssertValid() const;  
  31.     virtual void Dump(CDumpContext& dc) const;  
  32. #endif  
  33.   
  34. protected:  
  35.   
  36. // 生成的消息映射函数  
  37. protected:  
  38.     DECLARE_MESSAGE_MAP()  
  39. public:  
  40.     IplImage* pImg;  
  41.     int m_Display;  
  42.     BOOL Load(IplImage** pp, LPCTSTR csFilename);  
  43.     BOOL Save(LPCTSTR csFilename, IplImage* pImg);  
  44.     BOOL OnOpenDocument(LPCTSTR lpszPathName);  
  45. };  

 

[cpp] view plain copy
 
  1. // CVMFCDoc.cpp : CCVMFCDoc 类的实现  
  2. //Author:ZrqSophia  
  3. //2012-3-2  
  4.   
  5. #include "stdafx.h"  
  6. #include "CVMFC.h"  
  7.   
  8. #include "CVMFCDoc.h"  
  9.   
  10. #ifdef _DEBUG  
  11. #define new DEBUG_NEW  
  12. #endif  
  13.   
  14.   
  15. // CCVMFCDoc  
  16.   
  17. IMPLEMENT_DYNCREATE(CCVMFCDoc, CDocument)  
  18.   
  19. BEGIN_MESSAGE_MAP(CCVMFCDoc, CDocument)  
  20. END_MESSAGE_MAP()  
  21.   
  22.   
  23. // CCVMFCDoc 构造/析构  
  24.   
  25. CCVMFCDoc::CCVMFCDoc()  
  26. : pImg(NULL)  
  27. , m_Display(0)  
  28. {  
  29.     // TODO: 在此添加一次性构造代码  
  30.   
  31. }  
  32.   
  33. CCVMFCDoc::~CCVMFCDoc()  
  34. {  
  35. }  
  36.   
  37. BOOL CCVMFCDoc::OnNewDocument()  
  38. {  
  39.     if (!CDocument::OnNewDocument())  
  40.         return FALSE;  
  41.   
  42.     // TODO: 在此添加重新初始化代码  
  43.     // (SDI 文档将重用该文档)  
  44.   
  45.     return TRUE;  
  46. }  
  47.   
  48.   
  49.   
  50.   
  51. // CCVMFCDoc 序列化  
  52.   
  53. void CCVMFCDoc::Serialize(CArchive& ar)  
  54. {  
  55.     if (ar.IsStoring())  
  56.     {  
  57.         // TODO: 在此添加存储代码  
  58.     }  
  59.     else  
  60.     {  
  61.         // TODO: 在此添加加载代码  
  62.     }  
  63. }  
  64.   
  65.   
  66. // CCVMFCDoc 诊断  
  67.   
  68. #ifdef _DEBUG  
  69. void CCVMFCDoc::AssertValid() const  
  70. {  
  71.     CDocument::AssertValid();  
  72. }  
  73.   
  74. void CCVMFCDoc::Dump(CDumpContext& dc) const  
  75. {  
  76.     CDocument::Dump(dc);  
  77. }  
  78. #endif //_DEBUG  
  79.   
  80.   
  81. // CCVMFCDoc 命令  
  82.   
  83. BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename)  
  84. {  
  85.     IplImage* pImg=NULL;  
  86.   
  87.     pImg = cvLoadImage(csFilename,-1);      //  读图像文件(DSCV)  
  88.     if (!pImg) return(false);  
  89.     cvFlip(pImg);                           //  与 DIB 像素结构一致  
  90.     if (*pp) {  
  91.         cvReleaseImage(pp);  
  92.     }  
  93.     (*pp)=pImg;  
  94.     m_Display=0;  
  95.     return(true);  
  96. }  
  97.   
  98. BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg)  
  99. {  
  100.     int   bl;  
  101.     cvFlip(pImg);                           //  恢复原 OpenCV 位图结构  
  102.     bl=cvSaveImage(csFilename,pImg);        //  图像存盘  
  103.     return(bl);  
  104. }  
  105.   
  106. BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)  
  107. {  
  108.     if(!CDocument::OnOpenDocument(lpszPathName))    return false;  
  109.     Load(&pImg,lpszPathName);  
  110.     if(pImg) return true;  
  111.     return false;  
  112. }  

 

[cpp] view plain copy
 
  1. // CVMFCView.h : CCVMFCView 类的接口  
  2. //@Author:Zrqsophia  
  3. //@2012-3-2  
  4.   
  5. #pragma once  
  6.   
  7.   
  8. class CCVMFCView : public CScrollView  
  9. {  
  10. protected: // 仅从序列化创建  
  11.     CCVMFCView();  
  12.     DECLARE_DYNCREATE(CCVMFCView)  
  13.   
  14. // 属性  
  15. public:  
  16.     CCVMFCDoc* GetDocument() const;  
  17.   
  18. // 操作  
  19. public:  
  20.   
  21. // 重写  
  22. public:  
  23.     virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图  
  24.     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);  
  25. protected:  
  26.     virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);  
  27.     virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);  
  28.     virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);  
  29.   
  30. // 实现  
  31. public:  
  32.     virtual ~CCVMFCView();  
  33. #ifdef _DEBUG  
  34.     virtual void AssertValid() const;  
  35.     virtual void Dump(CDumpContext& dc) const;  
  36. #endif  
  37.   
  38. protected:  
  39.     IplImage* saveImg;  
  40.     IplImage* workImg;  
  41.   
  42.     LPBITMAPINFO m_lpBmi;  
  43.   
  44.     int     m_CaptFlag;  
  45.     int     m_dibFlag;  
  46.     int     m_SaveFlag;  
  47.     int     m_ImageType;  
  48. // 生成的消息映射函数  
  49. protected:  
  50.     afx_msg void OnFilePrintPreview();  
  51.     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);  
  52.     afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);  
  53.     DECLARE_MESSAGE_MAP()  
  54. public:  
  55.     virtual void OnInitialUpdate();  
  56.     afx_msg void OnSize(UINT nType, int cx, int cy);  
  57.     afx_msg void OnFileSaveAs();  
  58.     afx_msg void OnColorImageRefresh();  
  59. };  
  60.   
  61. #ifndef _DEBUG  // CVMFCView.cpp 中的调试版本  
  62. inline CCVMFCDoc* CCVMFCView::GetDocument() const  
  63.    { return reinterpret_cast<CCVMFCDoc*>(m_pDocument); }  
  64. #endif  

 

[cpp] view plain copy
 
    1. // CVMFCView.cpp : CCVMFCView 类的实现  
    2. //@Author:ZrqSophia  
    3. //@2012-3-2  
    4.   
    5. #include "stdafx.h"  
    6. #include "CVMFC.h"  
    7.   
    8. #include "CVMFCDoc.h"  
    9. #include "CVMFCView.h"  
    10. #include "resource.h"  
    11.   
    12. #ifdef _DEBUG  
    13. #define new DEBUG_NEW  
    14. #endif  
    15.   
    16.   
    17. // CCVMFCView  
    18.   
    19. IMPLEMENT_DYNCREATE(CCVMFCView, CScrollView)  
    20.   
    21. BEGIN_MESSAGE_MAP(CCVMFCView, CScrollView)  
    22.     // 标准打印命令  
    23.     ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)  
    24.     ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)  
    25.     ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)  
    26.     ON_WM_SIZE()  
    27.     ON_COMMAND(ID_FILE_SAVE_AS, &CCVMFCView::OnFileSaveAs)  
    28.     ON_COMMAND(ID_COLOR_IMAGE_REFRESH, &CCVMFCView::OnColorImageRefresh)  
    29. END_MESSAGE_MAP()  
    30.   
    31. // CCVMFCView 构造/析构  
    32.   
    33. CFile fCapture;  
    34. CFileException eCapture;  
    35. char pbuf[20];  
    36. int  captSetFlag=0;  
    37.   
    38. CCVMFCView::CCVMFCView()  
    39. {  
    40.     // TODO: 在此处添加构造代码  
    41.     saveImg    = NULL;  
    42.     workImg    = NULL;  
    43.   
    44.     m_lpBmi    = 0;  
    45.   
    46.     m_CaptFlag = 0;  
    47.     m_dibFlag  = 0;  
    48.     m_ImageType= 0;  
    49.   
    50.     CSize sizeTotal;  
    51.     sizeTotal.cx = sizeTotal.cy = 100;  
    52.     SetScrollSizes(MM_TEXT, sizeTotal);  
    53. }  
    54.   
    55. CCVMFCView::~CCVMFCView()  
    56. {  
    57.     if (saveImg)  
    58.         cvReleaseImage(&saveImg);           //  释放位图  
    59.     if (workImg)  
    60.         cvReleaseImage(&workImg);  
    61.   
    62.     if (m_lpBmi)  
    63.         free(m_lpBmi);                      //  释放位图信息  
    64. }  
    65.   
    66. BOOL CCVMFCView::PreCreateWindow(CREATESTRUCT& cs)  
    67. {  
    68.     // TODO: 在此处通过修改  
    69.     //  CREATESTRUCT cs 来修改窗口类或样式  
    70.   
    71.     return CScrollView::PreCreateWindow(cs);  
    72. }  
    73.   
    74. // CCVMFCView 绘制  
    75.   
    76. void CCVMFCView::OnDraw(CDC* pDC)  
    77. {  
    78.     CCVMFCDoc* pDoc = GetDocument();  
    79.     ASSERT_VALID(pDoc);  
    80.     if (!pDoc)  
    81.         return;  
    82.   
    83.     // TODO: 在此处为本机数据添加绘制代码  
    84.     if(pDoc->pImg)  
    85.     {  
    86.         if(pDoc->m_Display==0)  
    87.         {  
    88.             imageClone(pDoc->pImg,&saveImg);  
    89.             m_dibFlag=imageClone(saveImg,&workImg);  
    90.   
    91.             m_ImageType=imageType(workImg);  
    92.             m_SaveFlag=m_ImageType;  
    93.             pDoc->m_Display=1;  
    94.         }  
    95.     }  
    96.   
    97.     if (m_dibFlag) {                        //  DIB 结构改变  
    98.         if (m_lpBmi)  
    99.             free(m_lpBmi);  
    100.         m_lpBmi=CtreateMapInfo(workImg,m_dibFlag);  
    101.         m_dibFlag=0;  
    102.   
    103.         CSize sizeTotal;  
    104.         sizeTotal=CSize(workImg->width,workImg->height);  
    105.         SetScrollSizes(MM_TEXT,sizeTotal);  
    106.     }  
    107.   
    108.     char* pBits;  
    109.     if(workImg)  
    110.         pBits=workImg->imageData;  
    111.   
    112.     if(workImg)  
    113.         StretchDIBits(pDC->m_hDC,  
    114.         0,0,workImg->width,workImg->height,  
    115.         0,0,workImg->width,workImg->height,  
    116.         pBits,m_lpBmi,DIB_RGB_COLORS,SRCCOPY);  
    117. }  
    118.   
    119.   
    120. // CCVMFCView 打印  
    121.   
    122.   
    123. void CCVMFCView::OnFilePrintPreview()  
    124. {  
    125.     AFXPrintPreview(this);  
    126. }  
    127.   
    128. BOOL CCVMFCView::OnPreparePrinting(CPrintInfo* pInfo)  
    129. {  
    130.     // 默认准备  
    131.     return DoPreparePrinting(pInfo);  
    132. }  
    133.   
    134. void CCVMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)  
    135. {  
    136.     // TODO: 添加额外的打印前进行的初始化过程  
    137. }  
    138.   
    139. void CCVMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)  
    140. {  
    141.     // TODO: 添加打印后进行的清理过程  
    142. }  
    143.   
    144. void CCVMFCView::OnRButtonUp(UINT nFlags, CPoint point)  
    145. {  
    146.     ClientToScreen(&point);  
    147.     OnContextMenu(this, point);  
    148. }  
    149.   
    150. void CCVMFCView::OnContextMenu(CWnd* pWnd, CPoint point)  
    151. {  
    152.     theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);  
    153. }  
    154.   
    155.   
    156. // CCVMFCView 诊断  
    157.   
    158. #ifdef _DEBUG  
    159. void CCVMFCView::AssertValid() const  
    160. {  
    161.     CScrollView::AssertValid();  
    162. }  
    163.   
    164. void CCVMFCView::Dump(CDumpContext& dc) const  
    165. {  
    166.     CScrollView::Dump(dc);  
    167. }  
    168.   
    169. CCVMFCDoc* CCVMFCView::GetDocument() const // 非调试版本是内联的  
    170. {  
    171.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCVMFCDoc)));  
    172.     return (CCVMFCDoc*)m_pDocument;  
    173. }  
    174. #endif //_DEBUG  
    175.   
    176.   
    177. // CCVMFCView 消息处理程序  
    178.   
    179. void CCVMFCView::OnInitialUpdate()  
    180. {  
    181.     CScrollView::OnInitialUpdate();  
    182.   
    183.     CSize sizeTotal;  
    184.     // TODO: calculate the total size of this view  
    185.     sizeTotal.cx = sizeTotal.cy = 100;  
    186.     SetScrollSizes(MM_TEXT, sizeTotal);  
    187. }  
    188.   
    189. void CCVMFCView::OnSize(UINT nType, int cx, int cy)  
    190. {  
    191.     CScrollView::OnSize(nType, cx, cy);  
    192.   
    193.     if (workImg) {                          //  刷新窗口画面  
    194.         CSize  sizeTotal;  
    195.         sizeTotal = CSize(workImg->width,workImg->height);  
    196.         SetScrollSizes(MM_TEXT, sizeTotal);   //  设置滚动条  
    197.     }  
    198. }  
    199.   
    200. void CCVMFCView::OnFileSaveAs()  
    201. {  
    202.     CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存为(*.bmp)|*.bmp|所有文件(*.*)|*.*||");  
    203.     CString strPath("");  
    204.     if(dlg.DoModal()==IDOK)  
    205.     {  
    206.         cvFlip(workImg);  
    207.         strPath=dlg.GetPathName();  
    208.         cvSaveImage(strPath,workImg);  
    209.         cvFlip(workImg);  
    210.     }  
    211. }  
    212. void CCVMFCView::OnColorImageRefresh()  
    213. {  
    214.     CCVMFCDoc* pDoc = GetDocument();  
    215.     ASSERT_VALID(pDoc);  
    216.     pDoc->m_Display=0;  
    217.     Invalidate();  
    218. }  
    219. //from: http://blog.csdn.net/abcjennifer/article/details/7313711