// CVOpenImgDoc.h : CCVOpenImgDoc 类的接口 // #pragma once class 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; int m_Display; // 操作 public: // 重写 public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); #ifdef SHARED_HANDLERS virtual void InitializeSearchContent(); virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds); #endif // SHARED_HANDLERS // 实现 public: virtual ~CCVOpenImgDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成的消息映射函数 protected: DECLARE_MESSAGE_MAP() #ifdef SHARED_HANDLERS // 用于为搜索处理程序设置搜索内容的 Helper 函数 void SetSearchContent(const CString& value); #endif // SHARED_HANDLERS public: 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 // CCVOpenImgDoc IMPLEMENT_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 _DEBUG void 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转为Mat I.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 once class 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 _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: 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]; // CCVOpenImgView IMPLEMENT_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_HANDLERS AFXPrintPreview(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_HANDLERS theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE); #endif } // CCVOpenImgView 诊断 #ifdef _DEBUG void 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转为Mat I.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 once class 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; int m_Display; // 操作 public: // 重写 public: virtual BOOL OnNewDocument(); virtual void Serialize(CArchive& ar); #ifdef SHARED_HANDLERS virtual void InitializeSearchContent(); virtual void OnDrawThumbnail(CDC& dc, LPRECT lprcBounds); #endif // SHARED_HANDLERS // 实现 public: virtual ~CCVOpenImgDoc(); #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif protected: // 生成的消息映射函数 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);}; 完整代码:
opencv 单文档 打开图像
最新推荐文章于 2023-02-03 15:13:43 发布