opencv 单文档 打开图像

来源:互联网 发布:留学生做饭软件 编辑:程序博客网 时间:2024/05/11 05:30
// CVOpenImgDoc.h : CCVOpenImgDoc 类的接口//#pragma onceclass CCVOpenImgDoc : public CDocument{protected: // 仅从序列化创建CCVOpenImgDoc();DECLARE_DYNCREATE(CCVOpenImgDoc)BOOL Load(IplImage** pImg,LPCTSTR pszFilename);BOOL Save(LPCTSTR pszFilename,IplImage* pImg);// 特性public:Mat m_srcImg;IplImage*pImg;intm_Display;// 操作public:// 重写public:virtual BOOL OnNewDocument();virtual void Serialize(CArchive& ar);#ifdef SHARED_HANDLERSvirtual void InitializeSearchContent();virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);#endif // SHARED_HANDLERS// 实现public:virtual ~CCVOpenImgDoc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// 生成的消息映射函数protected:DECLARE_MESSAGE_MAP()#ifdef SHARED_HANDLERS// 用于为搜索处理程序设置搜索内容的 Helper 函数void SetSearchContent(const CString& value);#endif // SHARED_HANDLERSpublic:virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);};
// CVOpenImgDoc.cpp : CCVOpenImgDoc 类的实现//#include "stdafx.h"// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的// ATL 项目中进行定义,并允许与该项目共享文档代码。#ifndef SHARED_HANDLERS#include "CVOpenImg.h"#endif#include "CVOpenImgDoc.h"#include <propkey.h>#ifdef _DEBUG#define new DEBUG_NEW#endif// CCVOpenImgDocIMPLEMENT_DYNCREATE(CCVOpenImgDoc, CDocument)BEGIN_MESSAGE_MAP(CCVOpenImgDoc, CDocument)END_MESSAGE_MAP()// CCVOpenImgDoc 构造/析构CCVOpenImgDoc::CCVOpenImgDoc(){pImg = NULL;m_Display = -1;}CCVOpenImgDoc::~CCVOpenImgDoc(){if (pImg)cvReleaseImage(&pImg);}BOOL CCVOpenImgDoc::OnNewDocument(){if (!CDocument::OnNewDocument())return FALSE;// TODO: 在此添加重新初始化代码// (SDI 文档将重用该文档)return TRUE;}// CCVOpenImgDoc 序列化void CCVOpenImgDoc::Serialize(CArchive& ar){if (ar.IsStoring()){// TODO: 在此添加存储代码}else{// TODO: 在此添加加载代码}}#ifdef SHARED_HANDLERS// 缩略图的支持void CCVOpenImgDoc::OnDrawThumbnail(CDC& dc, LPRECT lprcBounds){// 修改此代码以绘制文档数据dc.FillSolidRect(lprcBounds, RGB(255, 255, 255));CString strText = _T("TODO: implement thumbnail drawing here");LOGFONT lf;CFont* pDefaultGUIFont = CFont::FromHandle((HFONT) GetStockObject(DEFAULT_GUI_FONT));pDefaultGUIFont->GetLogFont(&lf);lf.lfHeight = 36;CFont fontDraw;fontDraw.CreateFontIndirect(&lf);CFont* pOldFont = dc.SelectObject(&fontDraw);dc.DrawText(strText, lprcBounds, DT_CENTER | DT_WORDBREAK);dc.SelectObject(pOldFont);}// 搜索处理程序的支持void CCVOpenImgDoc::InitializeSearchContent(){CString strSearchContent;// 从文档数据设置搜索内容。// 内容部分应由“;”分隔// 例如:  strSearchContent = _T("point;rectangle;circle;ole object;");SetSearchContent(strSearchContent);}void CCVOpenImgDoc::SetSearchContent(const CString& value){if (value.IsEmpty()){RemoveChunk(PKEY_Search_Contents.fmtid, PKEY_Search_Contents.pid);}else{CMFCFilterChunkValueImpl *pChunk = NULL;ATLTRY(pChunk = new CMFCFilterChunkValueImpl);if (pChunk != NULL){pChunk->SetTextValue(PKEY_Search_Contents, value, CHUNK_TEXT);SetChunkValue(pChunk);}}}#endif // SHARED_HANDLERS// CCVOpenImgDoc 诊断#ifdef _DEBUGvoid CCVOpenImgDoc::AssertValid() const{CDocument::AssertValid();}void CCVOpenImgDoc::Dump(CDumpContext& dc) const{CDocument::Dump(dc);}#endif //_DEBUG// CCVOpenImgDoc 命令BOOL CCVOpenImgDoc::OnOpenDocument(LPCTSTR lpszPathName){if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;// 载入图像Load(&pImg,  lpszPathName);if (pImg != NULL) return TRUE;else     return FALSE;}/************************************************************************//*    函数名:Load   参  数:IplImage** pp           LPCTSTR csFileName   返回值:BOOL   功  能:载入图像*//************************************************************************/BOOL CCVOpenImgDoc::Load(IplImage** pp, LPCTSTR csFileName){IplImage* pImg = NULL;pImg = cvLoadImage(csFileName, -1);      // 读图像文件(DSCV)if (!pImg) return(false);cvFlip(pImg);                            // 与 DIB 像素结构一致Mat I(pImg);                         // 将IplImage转为MatI.copyTo(m_srcImg);if (*pp){cvReleaseImage(pp);}(*pp) = pImg;m_Display = 0;return(true);}/************************************************************************//*    函数名:Save   参  数:LPCTSTR csFileName           IplImage* pImg   返回值:BOOL   功  能:保存图像*//************************************************************************/BOOL CCVOpenImgDoc::Save(LPCTSTR csFileName, IplImage* pImg){int   bl;cvFlip(pImg);                             //  恢复原 OpenCV 位图结构bl = cvSaveImage(csFileName,pImg);        //  图像存盘cvFlip(pImg);                             // 与 DIB 像素结构一致return(bl);}

// CVOpenImgView.h : CCVOpenImgView 类的接口//#pragma onceclass CCVOpenImgView : public CScrollView{protected: // 仅从序列化创建CCVOpenImgView();DECLARE_DYNCREATE(CCVOpenImgView)// 特性public:CCVOpenImgDoc* GetDocument() const;// 操作public:int imageClone(IplImage* pi,IplImage** ppo);int imageType(IplImage* p);LPBITMAPINFO CtreateMapInfo(IplImage* workImg,int flag);// 重写public:virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图virtual BOOL PreCreateWindow(CREATESTRUCT& cs);protected:virtual void OnInitialUpdate(); // 构造后第一次调用virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);// 实现public:virtual ~CCVOpenImgView();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected: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:afx_msg void OnSize(UINT nType, int cx, int cy);afx_msg void OnFileSaveAs();afx_msg void OnConservationImage();};#ifndef _DEBUG  // CVOpenImgView.cpp 中的调试版本inline CCVOpenImgDoc* CCVOpenImgView::GetDocument() const   { return reinterpret_cast<CCVOpenImgDoc*>(m_pDocument); }#endif
// CVOpenImgView.cpp : CCVOpenImgView 类的实现//#include "stdafx.h"// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的// ATL 项目中进行定义,并允许与该项目共享文档代码。#ifndef SHARED_HANDLERS#include "CVOpenImg.h"#endif#include "CVOpenImgDoc.h"#include "CVOpenImgView.h"#ifdef _DEBUG#define new DEBUG_NEW#endif//---------------------------------------------------------//  VGA 256色默认调色板数据RGBQUAD VgaDefPal[256] = {{0x00,0x00,0x00,0x00},{0xa8,0x00,0x00,0x00},{0x00,0xa8,0x00,0x00},{0xa8,0xa8,0x00,0x00},{0x00,0x00,0xa8,0x00},{0xa8,0x00,0xa8,0x00},{0x00,0x54,0xa8,0x00},{0xa8,0xa8,0xa8,0x00},{0x54,0x54,0x54,0x00},{0xfc,0x54,0x54,0x00},{0x54,0xfc,0x54,0x00},{0xfc,0xfc,0x54,0x00},{0x54,0x54,0xfc,0x00},{0xfc,0x54,0xfc,0x00},{0x54,0xfc,0xfc,0x00},{0xfc,0xfc,0xfc,0x00},{0x00,0x00,0x00,0x00},{0x14,0x14,0x14,0x00},{0x20,0x20,0x20,0x00},{0x2c,0x2c,0x2c,0x00},{0x38,0x38,0x38,0x00},{0x44,0x44,0x44,0x00},{0x50,0x50,0x50,0x00},{0x60,0x60,0x60,0x00},{0x70,0x70,0x70,0x00},{0x80,0x80,0x80,0x00},{0x90,0x90,0x90,0x00},{0xa0,0xa0,0xa0,0x00},{0xb4,0xb4,0xb4,0x00},{0xc8,0xc8,0xc8,0x00},{0xe0,0xe0,0xe0,0x00},{0xfc,0xfc,0xfc,0x00},{0xfc,0x00,0x00,0x00},{0xfc,0x00,0x40,0x00},{0xfc,0x00,0x7c,0x00},{0xfc,0x00,0xbc,0x00},{0xfc,0x00,0xfc,0x00},{0xbc,0x00,0xfc,0x00},{0x7c,0x00,0xfc,0x00},{0x40,0x00,0xfc,0x00},{0x00,0x00,0xfc,0x00},{0x00,0x40,0xfc,0x00},{0x00,0x7c,0xfc,0x00},{0x00,0xbc,0xfc,0x00},{0x00,0xfc,0xfc,0x00},{0x00,0xfc,0xbc,0x00},{0x00,0xfc,0x7c,0x00},{0x00,0xfc,0x40,0x00},{0x00,0xfc,0x00,0x00},{0x40,0xfc,0x00,0x00},{0x7c,0xfc,0x00,0x00},{0xbc,0xfc,0x00,0x00},{0xfc,0xfc,0x00,0x00},{0xfc,0xbc,0x00,0x00},{0xfc,0x7c,0x00,0x00},{0xfc,0x40,0x00,0x00},{0xfc,0x7c,0x7c,0x00},{0xfc,0x7c,0x9c,0x00},{0xfc,0x7c,0xbc,0x00},{0xfc,0x7c,0xdc,0x00},{0xfc,0x7c,0xfc,0x00},{0xdc,0x7c,0xfc,0x00},{0xbc,0x7c,0xfc,0x00},{0x9c,0x7c,0xfc,0x00},{0x7c,0x7c,0xfc,0x00},{0x7c,0x9c,0xfc,0x00},{0x7c,0xbc,0xfc,0x00},{0x7c,0xdc,0xfc,0x00},{0x7c,0xfc,0xfc,0x00},{0x7c,0xfc,0xdc,0x00},{0x7c,0xfc,0xbc,0x00},{0x7c,0xfc,0x9c,0x00},{0x7c,0xfc,0x7c,0x00},{0x9c,0xfc,0x7c,0x00},{0xbc,0xfc,0x7c,0x00},{0xdc,0xfc,0x7c,0x00},{0xfc,0xfc,0x7c,0x00},{0xfc,0xdc,0x7c,0x00},{0xfc,0xbc,0x7c,0x00},{0xfc,0x9c,0x7c,0x00},{0xfc,0xb4,0xb4,0x00},{0xfc,0xb4,0xc4,0x00},{0xfc,0xb4,0xd8,0x00},{0xfc,0xb4,0xe8,0x00},{0xfc,0xb4,0xfc,0x00},{0xe8,0xb4,0xfc,0x00},{0xd8,0xb4,0xfc,0x00},{0xc4,0xb4,0xfc,0x00},{0xb4,0xb4,0xfc,0x00},{0xb4,0xc4,0xfc,0x00},{0xb4,0xd8,0xfc,0x00},{0xb4,0xe8,0xfc,0x00},{0xb4,0xfc,0xfc,0x00},{0xb4,0xfc,0xe8,0x00},{0xb4,0xfc,0xd8,0x00},{0xb4,0xfc,0xc4,0x00},{0xb4,0xfc,0xb4,0x00},{0xc4,0xfc,0xb4,0x00},{0xd8,0xfc,0xb4,0x00},{0xe8,0xfc,0xb4,0x00},{0xfc,0xfc,0xb4,0x00},{0xfc,0xe8,0xb4,0x00},{0xfc,0xd8,0xb4,0x00},{0xfc,0xc4,0xb4,0x00},{0x70,0x00,0x00,0x00},{0x70,0x00,0x1c,0x00},{0x70,0x00,0x38,0x00},{0x70,0x00,0x54,0x00},{0x70,0x00,0x70,0x00},{0x54,0x00,0x70,0x00},{0x38,0x00,0x70,0x00},{0x1c,0x00,0x70,0x00},{0x00,0x00,0x70,0x00},{0x00,0x1c,0x70,0x00},{0x00,0x38,0x70,0x00},{0x00,0x54,0x70,0x00},{0x00,0x70,0x70,0x00},{0x00,0x70,0x54,0x00},{0x00,0x70,0x38,0x00},{0x00,0x70,0x1c,0x00},{0x00,0x70,0x00,0x00},{0x1c,0x70,0x00,0x00},{0x38,0x70,0x00,0x00},{0x54,0x70,0x00,0x00},{0x70,0x70,0x00,0x00},{0x70,0x54,0x00,0x00},{0x70,0x38,0x00,0x00},{0x70,0x1c,0x00,0x00},{0x70,0x38,0x38,0x00},{0x70,0x38,0x44,0x00},{0x70,0x38,0x54,0x00},{0x70,0x38,0x60,0x00},{0x70,0x38,0x70,0x00},{0x60,0x38,0x70,0x00},{0x54,0x38,0x70,0x00},{0x44,0x38,0x70,0x00},{0x38,0x38,0x70,0x00},{0x38,0x44,0x70,0x00},{0x38,0x54,0x70,0x00},{0x38,0x60,0x70,0x00},{0x38,0x70,0x70,0x00},{0x38,0x70,0x60,0x00},{0x38,0x70,0x54,0x00},{0x38,0x70,0x44,0x00},{0x38,0x70,0x38,0x00},{0x44,0x70,0x38,0x00},{0x54,0x70,0x38,0x00},{0x60,0x70,0x38,0x00},{0x70,0x70,0x38,0x00},{0x70,0x60,0x38,0x00},{0x70,0x54,0x38,0x00},{0x70,0x44,0x38,0x00},{0x70,0x50,0x50,0x00},{0x70,0x50,0x58,0x00},{0x70,0x50,0x60,0x00},{0x70,0x50,0x68,0x00},{0x70,0x50,0x70,0x00},{0x68,0x50,0x70,0x00},{0x60,0x50,0x70,0x00},{0x58,0x50,0x70,0x00},{0x50,0x50,0x70,0x00},{0x50,0x58,0x70,0x00},{0x50,0x60,0x70,0x00},{0x50,0x68,0x70,0x00},{0x50,0x70,0x70,0x00},{0x50,0x70,0x68,0x00},{0x50,0x70,0x60,0x00},{0x50,0x70,0x58,0x00},{0x50,0x70,0x50,0x00},{0x58,0x70,0x50,0x00},{0x60,0x70,0x50,0x00},{0x68,0x70,0x50,0x00},{0x70,0x70,0x50,0x00},{0x70,0x68,0x50,0x00},{0x70,0x60,0x50,0x00},{0x70,0x58,0x50,0x00},{0x40,0x00,0x00,0x00},{0x40,0x00,0x10,0x00},{0x40,0x00,0x20,0x00},{0x40,0x00,0x30,0x00},{0x40,0x00,0x40,0x00},{0x30,0x00,0x40,0x00},{0x20,0x00,0x40,0x00},{0x10,0x00,0x40,0x00},{0x00,0x00,0x40,0x00},{0x00,0x10,0x40,0x00},{0x00,0x20,0x40,0x00},{0x00,0x30,0x40,0x00},{0x00,0x40,0x40,0x00},{0x00,0x40,0x30,0x00},{0x00,0x40,0x20,0x00},{0x00,0x40,0x10,0x00},{0x00,0x40,0x00,0x00},{0x10,0x40,0x00,0x00},{0x20,0x40,0x00,0x00},{0x30,0x40,0x00,0x00},{0x40,0x40,0x00,0x00},{0x40,0x30,0x00,0x00},{0x40,0x20,0x00,0x00},{0x40,0x10,0x00,0x00},{0x40,0x20,0x20,0x00},{0x40,0x20,0x28,0x00},{0x40,0x20,0x30,0x00},{0x40,0x20,0x38,0x00},{0x40,0x20,0x40,0x00},{0x38,0x20,0x40,0x00},{0x30,0x20,0x40,0x00},{0x28,0x20,0x40,0x00},{0x20,0x20,0x40,0x00},{0x20,0x28,0x40,0x00},{0x20,0x30,0x40,0x00},{0x20,0x38,0x40,0x00},{0x20,0x40,0x40,0x00},{0x20,0x40,0x38,0x00},{0x20,0x40,0x30,0x00},{0x20,0x40,0x28,0x00},{0x20,0x40,0x20,0x00},{0x28,0x40,0x20,0x00},{0x30,0x40,0x20,0x00},{0x38,0x40,0x20,0x00},{0x40,0x40,0x20,0x00},{0x40,0x38,0x20,0x00},{0x40,0x30,0x20,0x00},{0x40,0x28,0x20,0x00},{0x40,0x2c,0x2c,0x00},{0x40,0x2c,0x30,0x00},{0x40,0x2c,0x34,0x00},{0x40,0x2c,0x3c,0x00},{0x40,0x2c,0x40,0x00},{0x3c,0x2c,0x40,0x00},{0x34,0x2c,0x40,0x00},{0x30,0x2c,0x40,0x00},{0x2c,0x2c,0x40,0x00},{0x2c,0x30,0x40,0x00},{0x2c,0x34,0x40,0x00},{0x2c,0x3c,0x40,0x00},{0x2c,0x40,0x40,0x00},{0x2c,0x40,0x3c,0x00},{0x2c,0x40,0x34,0x00},{0x2c,0x40,0x30,0x00},{0x2c,0x40,0x2c,0x00},{0x30,0x40,0x2c,0x00},{0x34,0x40,0x2c,0x00},{0x3c,0x40,0x2c,0x00},{0x40,0x40,0x2c,0x00},{0x40,0x3c,0x2c,0x00},{0x40,0x34,0x2c,0x00},{0x40,0x30,0x2c,0x00},{0xa8,0xa8,0xa8,0x00},{0x54,0xfc,0xfc,0x00},{0xfc,0x54,0xfc,0x00},{0xfc,0xfc,0x54,0x00},{0xfc,0x54,0x54,0x00},{0x54,0xfc,0x54,0x00},{0x54,0x54,0xfc,0x00},{0xfc,0xfc,0xfc,0x00}  };RGBQUAD  VgaColorTab[256];// CCVOpenImgViewIMPLEMENT_DYNCREATE(CCVOpenImgView, CScrollView)BEGIN_MESSAGE_MAP(CCVOpenImgView, CScrollView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CScrollView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CCVOpenImgView::OnFilePrintPreview)ON_WM_CONTEXTMENU()ON_WM_RBUTTONUP()ON_WM_SIZE()ON_COMMAND(ID_FILE_SAVE_AS, &CCVOpenImgView::OnFileSaveAs)ON_COMMAND(ID_CONSERVATION_IMAGE, &CCVOpenImgView::OnConservationImage)END_MESSAGE_MAP()// CCVOpenImgView 构造/析构CCVOpenImgView::CCVOpenImgView(){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);}CCVOpenImgView::~CCVOpenImgView(){if (saveImg)cvReleaseImage(&saveImg);           //  释放位图if (workImg)cvReleaseImage(&workImg);if (m_lpBmi)free(m_lpBmi);                      //  释放位图信息}BOOL CCVOpenImgView::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改//  CREATESTRUCT cs 来修改窗口类或样式return CScrollView::PreCreateWindow(cs);}// CCVOpenImgView 绘制void CCVOpenImgView::OnDraw(CDC* pDC){CCVOpenImgDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;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);}void CCVOpenImgView::OnInitialUpdate(){CScrollView::OnInitialUpdate();CSize sizeTotal;sizeTotal.cx = sizeTotal.cy = 100;SetScrollSizes(MM_TEXT, sizeTotal);}// CCVOpenImgView 打印void CCVOpenImgView::OnFilePrintPreview(){#ifndef SHARED_HANDLERSAFXPrintPreview(this);#endif}BOOL CCVOpenImgView::OnPreparePrinting(CPrintInfo* pInfo){// 默认准备return DoPreparePrinting(pInfo);}void CCVOpenImgView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: 添加额外的打印前进行的初始化过程}void CCVOpenImgView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/){// TODO: 添加打印后进行的清理过程}void CCVOpenImgView::OnRButtonUp(UINT /* nFlags */, CPoint point){ClientToScreen(&point);OnContextMenu(this, point);}void CCVOpenImgView::OnContextMenu(CWnd* /* pWnd */, CPoint point){#ifndef SHARED_HANDLERStheApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);#endif}// CCVOpenImgView 诊断#ifdef _DEBUGvoid CCVOpenImgView::AssertValid() const{CScrollView::AssertValid();}void CCVOpenImgView::Dump(CDumpContext& dc) const{CScrollView::Dump(dc);}CCVOpenImgDoc* CCVOpenImgView::GetDocument() const // 非调试版本是内联的{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCVOpenImgDoc)));return (CCVOpenImgDoc*)m_pDocument;}#endif //_DEBUG// CCVOpenImgView 消息处理程序/************************************************************************//*    函数名:imageClone   参  数:IplImage* pi   IplImage** ppo   返回值:int   功  能:复制 IplImage 位图*//************************************************************************/int  CCVOpenImgView::imageClone(IplImage* pi, IplImage** ppo) {if (*ppo) {cvReleaseImage(ppo);                //  释放原来位图}(*ppo) = cvCloneImage(pi);              //  复制新位图return(1);}/************************************************************************//*    函数名:imageType   参  数:IplImage* p   返回值:int   功  能:检查图像类型*//************************************************************************/int  CCVOpenImgView::imageType(IplImage* p) {int i, j, k, bpl, n, pg[256];BYTE *buf;k = p->nChannels;//  检查二值图像if (k == 1) {                             for (i = 0; i < 256; i++) pg[i] = 0;buf = (BYTE*)p->imageData;bpl = p->widthStep;for (i = 0; i < p->height; i++){for (j = 0; j < p->width; j++) pg[buf[j]]++;buf+=bpl;}for (i = 0, n = 0; i < 256; i++){if (pg[i]) n++;}if (n==2) k=-1;                     //  二值图像}return(k);}/************************************************************************//*    函数名:CtreateMapInfo   参  数:IplImage* workImg           int flag   返回值:LPBITMAPINFO   功  能:创建位图信息头*//************************************************************************/LPBITMAPINFO CCVOpenImgView::CtreateMapInfo(IplImage* workImg,int flag){                                          BITMAPINFOHEADER BIH = {40, 1, 1, 1, 8, 0, 0, 0, 0, 0, 0};LPBITMAPINFO lpBmi;int wid,hei,bits,colors,i;wid =workImg->width;hei =workImg->height;bits=workImg->depth*workImg->nChannels;if (bits > 8) colors=0;else colors = 1 << bits;lpBmi = (LPBITMAPINFO) malloc(40 + 4 * colors);BIH.biWidth   = wid;BIH.biHeight  = hei;BIH.biBitCount= (BYTE) bits;memcpy(lpBmi, &BIH, 40);                  //  复制位图信息头if (bits == 8)                            //  256 色位图{                          if (flag == 1)                        //  设置灰阶调色板{                      for (i = 0; i < 256; i++) {VgaColorTab[i].rgbRed   = (BYTE) i;VgaColorTab[i].rgbGreen = (BYTE) i;VgaColorTab[i].rgbBlue  = (BYTE) i;}memcpy(lpBmi->bmiColors, VgaColorTab, 1024);}else if (flag == 2)                  //  设置默认调色板{                memcpy(lpBmi->bmiColors, VgaDefPal, 1024);}else if (flag == 3)                  //  设置自定义调色板{                memcpy(lpBmi->bmiColors, VgaColorTab, 1024);}}return(lpBmi);}void CCVOpenImgView::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 CCVOpenImgView::OnFileSaveAs(){CString csBMP = "BMP Files(*.BMP)|*.BMP|";CString csJPG = "JPEG Files(*.JPG)|*.JPG|";CString csTIF = "TIF Files(*.TIF)|*.TIF|";CString csPNG = "PNG Files(*.PNG)|*.PNG|";CString csDIB = "DIB Files(*.DIB)|*.DIB|";CString csPBM = "PBM Files(*.PBM)|*.PBM|";CString csPGM = "PGM Files(*.PGM)|*.PGM|";CString csPPM = "PPM Files(*.PPM)|*.PPM|";CString csSR  = "SR  Files(*.SR) |*.SR|";CString csRAS = "RAS Files(*.RAS)|*.RAS||";CString csFilter = csBMP + csJPG + csTIF + csPNG + csDIB+ csPBM + csPGM + csPPM + csSR + csRAS;CString name[]={"", "bmp" ,"jpg", "tif", "png", "dib","pbm", "pgm", "ppm", "sr", "ras", ""};CString strFileName;CString strExtension;CFileDialog FileDlg(false, NULL, NULL, OFN_HIDEREADONLY, csFilter);//  文件存盘对话框if (FileDlg.DoModal() == IDOK ) {         //  选择了文件名strFileName = FileDlg.m_ofn.lpstrFile;if (FileDlg.m_ofn.nFileExtension == 0) {  //  无文件后缀strExtension = name[FileDlg.m_ofn.nFilterIndex];strFileName = strFileName + '.' + strExtension;//  加文件后缀}CCVOpenImgDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDoc->Save(strFileName, workImg);   //  当前画面存盘}}void CCVOpenImgView::OnConservationImage(){imageClone(workImg,&saveImg);m_SaveFlag = m_ImageType;}



BOOL CCVOpenImgDoc::OnOpenDocument(LPCTSTR lpszPathName){if (!CDocument::OnOpenDocument(lpszPathName))return FALSE;// 载入图像Load(&pImg, lpszPathName);if (pImg != NULL) return TRUE;else return FALSE;}

/************************************************************************//*    函数名:Load   参  数:IplImage** pp           LPCTSTR csFileName   返回值:BOOL   功  能:载入图像*//************************************************************************/BOOL CCVOpenImgDoc::Load(IplImage** pp, LPCTSTR csFileName){IplImage* pImg = NULL;pImg = cvLoadImage(csFileName, -1);      // 读图像文件(DSCV)if (!pImg) return(false);cvFlip(pImg);                            // 与 DIB 像素结构一致Mat I(pImg);                         // 将IplImage转为MatI.copyTo(m_srcImg);if (*pp){cvReleaseImage(pp);}(*pp) = pImg;m_Display = 0;return(true);}

/************************************************************************//*    函数名:Save   参  数:LPCTSTR csFileName           IplImage* pImg   返回值:BOOL   功  能:保存图像*//************************************************************************/BOOL CCVOpenImgDoc::Save(LPCTSTR csFileName, IplImage* pImg){int   bl;cvFlip(pImg);                             //  恢复原 OpenCV 位图结构bl = cvSaveImage(csFileName,pImg);        //  图像存盘cvFlip(pImg);                             // 与 DIB 像素结构一致return(bl);}

// CVOpenImgDoc.h : CCVOpenImgDoc 类的接口//#pragma onceclass CCVOpenImgDoc : public CDocument{protected: // 仅从序列化创建CCVOpenImgDoc();DECLARE_DYNCREATE(CCVOpenImgDoc)BOOL Load(IplImage** pImg,LPCTSTR pszFilename);BOOL Save(LPCTSTR pszFilename,IplImage* pImg);// 特性public:Mat m_srcImg;IplImage*pImg;intm_Display;// 操作public:// 重写public:virtual BOOL OnNewDocument();virtual void Serialize(CArchive& ar);#ifdef SHARED_HANDLERSvirtual void InitializeSearchContent();virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds);#endif // SHARED_HANDLERS// 实现public:virtual ~CCVOpenImgDoc();#ifdef _DEBUGvirtual void AssertValid() const;virtual void Dump(CDumpContext& dc) const;#endifprotected:// 生成的消息映射函数protected:DECLARE_MESSAGE_MAP()#ifdef SHARED_HANDLERS// 用于为搜索处理程序设置搜索内容的 Helper 函数
void CCVOpenImgView::OnDraw(CDC* pDC){CCVOpenImgDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;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);}

// CCVOpenImgView 消息处理程序/************************************************************************//*    函数名:imageClone   参  数:IplImage* pi   IplImage** ppo   返回值:int   功  能:复制 IplImage 位图*//************************************************************************/int  CCVOpenImgView::imageClone(IplImage* pi, IplImage** ppo) {if (*ppo) {cvReleaseImage(ppo);                //  释放原来位图}(*ppo) = cvCloneImage(pi);              //  复制新位图return(1);}/************************************************************************//*    函数名:imageType   参  数:IplImage* p   返回值:int   功  能:检查图像类型*//************************************************************************/int  CCVOpenImgView::imageType(IplImage* p) {int i, j, k, bpl, n, pg[256];BYTE *buf;k = p->nChannels;//  检查二值图像if (k == 1) {                             for (i = 0; i < 256; i++) pg[i] = 0;buf = (BYTE*)p->imageData;bpl = p->widthStep;for (i = 0; i < p->height; i++){for (j = 0; j < p->width; j++) pg[buf[j]]++;buf+=bpl;}for (i = 0, n = 0; i < 256; i++){if (pg[i]) n++;}if (n==2) k=-1;                     //  二值图像}return(k);}/************************************************************************//*    函数名:CtreateMapInfo   参  数:IplImage* workImg           int flag   返回值:LPBITMAPINFO   功  能:创建位图信息头*//************************************************************************/LPBITMAPINFO CCVOpenImgView::CtreateMapInfo(IplImage* workImg,int flag){                                          BITMAPINFOHEADER BIH = {40, 1, 1, 1, 8, 0, 0, 0, 0, 0, 0};LPBITMAPINFO lpBmi;int wid,hei,bits,colors,i;wid =workImg->width;hei =workImg->height;bits=workImg->depth*workImg->nChannels;if (bits > 8) colors=0;else colors = 1 << bits;lpBmi = (LPBITMAPINFO) malloc(40 + 4 * colors);BIH.biWidth   = wid;BIH.biHeight  = hei;BIH.biBitCount= (BYTE) bits;memcpy(lpBmi, &BIH, 40);                  //  复制位图信息头if (bits == 8)                            //  256 色位图{                          if (flag == 1)                        //  设置灰阶调色板{                      for (i = 0; i < 256; i++) {VgaColorTab[i].rgbRed   = (BYTE) i;VgaColorTab[i].rgbGreen = (BYTE) i;VgaColorTab[i].rgbBlue  = (BYTE) i;}memcpy(lpBmi->bmiColors, VgaColorTab, 1024);}else if (flag == 2)                  //  设置默认调色板{                memcpy(lpBmi->bmiColors, VgaDefPal, 1024);}else if (flag == 3)                  //  设置自定义调色板{                memcpy(lpBmi->bmiColors, VgaColorTab, 1024);}}return(lpBmi);}void CCVOpenImgView::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 CCVOpenImgView::OnFileSaveAs(){CString csBMP = "BMP Files(*.BMP)|*.BMP|";CString csJPG = "JPEG Files(*.JPG)|*.JPG|";CString csTIF = "TIF Files(*.TIF)|*.TIF|";CString csPNG = "PNG Files(*.PNG)|*.PNG|";CString csDIB = "DIB Files(*.DIB)|*.DIB|";CString csPBM = "PBM Files(*.PBM)|*.PBM|";CString csPGM = "PGM Files(*.PGM)|*.PGM|";CString csPPM = "PPM Files(*.PPM)|*.PPM|";CString csSR  = "SR  Files(*.SR) |*.SR|";CString csRAS = "RAS Files(*.RAS)|*.RAS||";CString csFilter = csBMP + csJPG + csTIF + csPNG + csDIB+ csPBM + csPGM + csPPM + csSR + csRAS;CString name[]={"", "bmp" ,"jpg", "tif", "png", "dib","pbm", "pgm", "ppm", "sr", "ras", ""};CString strFileName;CString strExtension;CFileDialog FileDlg(false, NULL, NULL, OFN_HIDEREADONLY, csFilter);//  文件存盘对话框if (FileDlg.DoModal() == IDOK ) {         //  选择了文件名strFileName = FileDlg.m_ofn.lpstrFile;if (FileDlg.m_ofn.nFileExtension == 0) {  //  无文件后缀strExtension = name[FileDlg.m_ofn.nFilterIndex];strFileName = strFileName + '.' + strExtension;//  加文件后缀}CCVOpenImgDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDoc->Save(strFileName, workImg);   //  当前画面存盘}}void CCVOpenImgView::OnConservationImage(){imageClone(workImg,&saveImg);m_SaveFlag = m_ImageType;}

void SetSearchContent(const CString& value);#endif // SHARED_HANDLERSpublic:virtual BOOL OnOpenDocument(LPCTSTR lpszPathName);};
完整代码: