opencv 单文档 打开图像

// 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);};

完整代码:

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值