昨天,TG说要写一个保存图片的操作。虽然Halcon里提供了保存图片的函数write_image(Image : : Format,FillColor,FileName : ) 但是仅依靠这个函数是无法实现界面友好的。因此要做出一个具有windows风格的保存操作,还是得使用MFC的东西。
CFileDialog类封装了Windows常用的文件对话框。常用的文件对话框提供了一种简单的与Windows标准相一致的文件打开和文件存盘对话框功能。
Header: afxdlgs.h
CFileDialog::CFileDialog
|
(
BOOL bOpenFileDialog, \\TRUE则显示打开文件对话框,FALSE则显示保存文件对话框。
LPCTSTR lpszDefExt = NULL, \\指定默认的文件扩展名。
LPCTSTR lpszFileName = NULL, \\指定默认的文件名, 可带上完整的文件路径_T("D:\\Visual Studio 2015\\Projects\\OpenCamHalcon\\MyPic.bmp")
DWORD dwFlags = OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT, \\指明一些特定风格。
LPCTSTR lpszFilter = NULL, \\指明可供选择的文件类型和相应的扩展名。
CWnd* pParentWnd = NULL \\为父窗口指针。
);
要完成write_image,还需要的参数 Format,FileName如何获取呢?
CFileDialog::GetFileExt()返回选定文件的扩展文件名
CFileDialog::GetFileName()返回选定文件的文件名
注意到write_image(ImageReduced1, "bmp", 0, "F:/视觉培训/机器视觉第1课/2.bmp");
LIntExport Herror write_image(const Halcon::Hobject &Image, const char *Format, Hlong FillColor, const char *FileName);
问题来了
1、路径中“\\”与"/"替换; fileName.Replace(L"\\",L"/");
2、LPCTSTR与Char的转换; char *file = T2A(fileName);
void COpenCamHalconDlg::OnBnClickedButtonSavePic()
{
// TODO: 在此添加控件通知处理程序代码
CString str;
BOOL isOpen = FALSE; //是否打开(否则为保存)
CString defaultDir = _T("D:\\Visual Studio 2015\\Projects\\OpenCamHalcon"); //默认打开的文件路径
CString fileName = L"test.bmp"; //默认打开的文件名
CString filter = L"位图(*.bmp)|*.bmp|jpg(*.jpg)|*.jpg||"; //文件过虑的类型
CFileDialog openFileDlg(isOpen,NULL, defaultDir+ "\\" +fileName, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, filter, NULL);
INT_PTR result = openFileDlg.DoModal();
if (result == IDOK)
{
fileName = openFileDlg.GetPathName();
fileName.Replace(L"\\",L"/");
switch (openFileDlg.m_ofn.nFilterIndex)
{
case 1:
filter = L"bmp";
break;
case 2:
filter = L"jpeg";
}
USES_CONVERSION;
char *file = T2A(fileName);
char *filterCH = T2A(filter);
write_image(Image, filterCH, 0, file);
}
}