// 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); // 当前画面存盘
}
}