openCV 对话框 显示图像

// CVDlgReadDlg.h : 头文件
//

#pragma once
#include 
#include 
#include 
#include 


using namespace std;
using namespace cv;


// CCVDlgReadDlg 对话框
class CCVDlgReadDlg : public CDialog
{
// 构造
public:
	CCVDlgReadDlg(CWnd* pParent = NULL);	// 标准构造函数
	~CCVDlgReadDlg();

	int imageClone(IplImage* pi, IplImage** ppo); 
	int imageType(IplImage* p); 
	LPBITMAPINFO CtreateMapInfo(IplImage* workImg,int flag);
	BOOL CCVDlgReadDlg::Save(LPCTSTR csFileName, IplImage* m_pImg);
	BOOL Load(IplImage* srcImg, LPCTSTR csFileName);
	string CStringTostring(CString str);

// 对话框数据
	enum { IDD = IDD_CVDLGREAD_DIALOG };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOpenImage();
	afx_msg void OnBnClickedSave();

public:
	Mat m_srcImg;
	IplImage*	m_pImg;
	IplImage*	m_pImgSrcToSave;
	IplImage* saveImg;
	IplImage* workImg;
	LPBITMAPINFO m_lpBmi;

	int		m_Display;
	int     m_dibFlag;
	int     m_SaveFlag;
	int     m_ImageType;
	CString m_csFileName;

};


 

// CVDlgReadDlg.cpp : 实现文件
//

#include "stdafx.h"
#include "CVDlgRead.h"
#include "CVDlgReadDlg.h"
#include "afxdialogex.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];

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx
{
public:
	CAboutDlg();

// 对话框数据
	enum { IDD = IDD_ABOUTBOX };

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现
protected:
	DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


// CCVDlgReadDlg 对话框




CCVDlgReadDlg::CCVDlgReadDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CCVDlgReadDlg::IDD, pParent)
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

	m_pImg = NULL;
	m_pImgSrcToSave = NULL;
	saveImg    = NULL;
	workImg    = NULL;
	m_lpBmi    = 0;
	m_dibFlag  = 0;
	m_ImageType= 0;
	m_csFileName = "";

	m_Display = -1;
}


CCVDlgReadDlg::~CCVDlgReadDlg()
{
	if (saveImg)
		cvReleaseImage(&saveImg);           //  释放位图
	if (workImg)
		cvReleaseImage(&workImg);

	if (m_lpBmi)
		free(m_lpBmi);                      //  释放位图信息
}

void CCVDlgReadDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CCVDlgReadDlg, CDialog)
	ON_WM_SYSCOMMAND()
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_OPEN_IMAGE, &CCVDlgReadDlg::OnBnClickedOpenImage)
	ON_BN_CLICKED(IDC_SAVE, &CCVDlgReadDlg::OnBnClickedSave)
END_MESSAGE_MAP()


// CCVDlgReadDlg 消息处理程序

BOOL CCVDlgReadDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// 将“关于...”菜单项添加到系统菜单中。

	// IDM_ABOUTBOX 必须在系统命令范围内。
	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
	ASSERT(IDM_ABOUTBOX < 0xF000);

	CMenu* pSysMenu = GetSystemMenu(FALSE);
	if (pSysMenu != NULL)
	{
		BOOL bNameValid;
		CString strAboutMenu;
		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
		ASSERT(bNameValid);
		if (!strAboutMenu.IsEmpty())
		{
			pSysMenu->AppendMenu(MF_SEPARATOR);
			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
		}
	}

	// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void CCVDlgReadDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
	{
		CAboutDlg dlgAbout;
		dlgAbout.DoModal();
	}
	else
	{
		CDialog::OnSysCommand(nID, lParam);
	}
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CCVDlgReadDlg::OnPaint()
{
	CPaintDC dc(this); // 用于绘制的设备上下文

	if (IsIconic())
	{
		SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialog::OnPaint();
	}

	//---------------------------------------------------------
	if(m_pImg)
	{
		if(m_Display == 0)
		{
			// 复制图像
			imageClone(m_pImg, &saveImg);
			m_dibFlag = imageClone(saveImg, &workImg);

			// 判断图像类型
			m_ImageType = imageType(workImg);
			m_SaveFlag = m_ImageType;
			m_Display = 1;
		}
	}

	if (m_dibFlag) 
	{                        
    	//  DIB 结构改变,创建位图信息头
		if (m_lpBmi)
			free(m_lpBmi);
		m_lpBmi = CtreateMapInfo(workImg,m_dibFlag);
		m_dibFlag = 0;
	}

	// 图像数据
	char* pBits;
	if(workImg)
		pBits = workImg->imageData;


	// 显示位图
	if(workImg)
	{
		StretchDIBits(dc.m_hDC,
		0, 0, workImg->width, workImg->height,
		0, 0, workImg->width, workImg->height,
		pBits, m_lpBmi, DIB_RGB_COLORS, SRCCOPY);
	}

}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CCVDlgReadDlg::OnQueryDragIcon()
{
	return static_cast(m_hIcon);
}


/************************************************************************
函数:OnBnClickedOpenImage
功能:加载图像
************************************************************************/
void CCVDlgReadDlg::OnBnClickedOpenImage()
{

	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 = csJPG + csBMP + 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(TRUE, NULL, NULL, OFN_HIDEREADONLY, csFilter);
	if (FileDlg.DoModal() == IDOK )                          
	{        
	    // 载入图像
		m_csFileName = FileDlg.GetPathName();
		const char *lpctStr = (LPCTSTR)m_csFileName;
		Load(m_pImg,  lpctStr);
	} 
	Invalidate(TRUE);
}

/************************************************************************
函数:CStringTostring
功能:将CString转换为string
************************************************************************/
string CCVDlgReadDlg::CStringTostring(CString str)
{
	string s;
	s.append(str.GetBuffer(str.GetLength()));
	str.ReleaseBuffer();
	return s;
}

/************************************************************************/
/* 
   函数名:Load
   参  数:IplImage** pp
           LPCTSTR csFileName
   返回值:BOOL
   功  能:载入图像
*/
/************************************************************************/
BOOL CCVDlgReadDlg::Load(IplImage* srcImg, LPCTSTR csFileName)
{
	srcImg = cvLoadImage(csFileName, -1);      // 读图像文件(DSCV)
	if (!srcImg) return(false);

	// 载入的图像未调整大小,用于保存
	m_pImgSrcToSave = srcImg;

	// 调整图像大小,以方便显示
	IplImage * imageresize = cvCreateImage(cvSize(400, 400),IPL_DEPTH_8U, 3);  
	cvResize(srcImg, imageresize,CV_INTER_LINEAR);

	cvFlip(imageresize);                       // 与 DIB 像素结构一致
	m_pImg = imageresize;

	Mat I(m_pImg);	                           // 将IplImage转为Mat
	I.copyTo(m_srcImg);

	m_Display = 0;

	return(true);
 
}

/************************************************************************/
/* 
   函数名:imageClone
   参  数:IplImage* pi
		   IplImage** ppo
   返回值:int
   功  能:复制 IplImage 位图
*/
/************************************************************************/
int  CCVDlgReadDlg::imageClone(IplImage* pi, IplImage** ppo) 
{
	if (*ppo) 
	{
		cvReleaseImage(ppo);                //  释放原来位图
	}

	(*ppo) = cvCloneImage(pi);              //  复制新位图

	return(1);
}


/************************************************************************/
/* 
   函数名:imageType
   参  数:IplImage* p
   返回值:int
   功  能:检查图像类型
*/
/************************************************************************/
int  CCVDlgReadDlg::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 CCVDlgReadDlg::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);
}


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

void CCVDlgReadDlg::OnBnClickedSave()
{
	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;  //  加文件后缀	
		}

		Save(strFileName, m_pImgSrcToSave);                   //  当前画面存盘
	} 
}

openCV 对话框 显示图像_第1张图片

你可能感兴趣的:(opencv学习)