基于文件搜索功能的图像融合程序实现

2014-08-21 14:10何源
科技与创新 2014年11期
关键词:应用程序

摘 要:针对现有的图像融合软件在读入大量图像并进行重复操作时不能实现批量自动化操作的问题,提出了使用文件搜索功能来改变现状的方法。分析了MFC类库中文件读写和文件搜索的相关函数,讨论了各函数的功能和所需要传递的参数。利用MFC类库的文件读写和文件搜索的相关函数,设计出了高效、自动传递并读写数据的图像融合程序。该程序节省了用户进行大量重复性工作的时间。实验证明,该程序性能良好,并且用户友好度较高。

关键词:文件搜索;MFC;CFileFind;应用程序

中图分类号:TP391.41 文献标识码:A 文章编号:2095-6835(2014)11-0126-02

在开发Windows应用程序时,常常要将搜索程序应用到相关文件中。假如应用程序没有自动搜索文件的功能,就需要用户手动,一个一个地选择文件并进行相关操作,这样不仅费时费力、用户友好度极低,而且在工作量较大的情况下,难免会出现操作失误的情况,影响用户的工作效率。微软基础类库封装了大量的Windows API函数,其中就包含文件搜索的相关函数,为应用程序开发者提供了便利的条件。

1 MFC类库及程序使用的相关函数介绍

微软基础类库(Microsoft Foundation Classes Library),简称MFC,是微软公司在C++编程语言的基础上实现的一个基础类库,它是一种面向对象的函数库。在这个类库中,封装了Windows操作系统关于窗口式用户接口的基础函数,这样程序开发者就不必再编写大量复杂的窗口响应实现代码,只需编写具体功能实现程序即可。这样做免去了大量繁重的重复性工作,使得基于Windows操作系统的应用程序开发变得简单、快捷,大大缩短了程序开发的周期。

MFC搭建了一个应用程序框架,我们需要做的只是根据具体的应用场景选择合适的框架,并且为框架填充具有实际用途的内容。同时,MFC还为我们提供了很多辅助资源,例如向导、图标、位图等,让开发者可以编写出用户友好度较高的界面接口应用程序。

MFC类库奉行单继承的风格,所以,其所有的类都继承自一个唯一的根类,即CObject。CFile类继承自CObject类,是以二进制的方式读取和写入文件的类。CFile类封装了Win32环境下的文件创建、文件读写等文件操作相关函数。CFile类的主要方法有:①CFile,一个路径和文件句柄构造一个CFile对象;②Read,将文件读取到一块缓存上;③Write,将缓存中的数据写入指定文件中等。

文中用到的函数主要有以下两种。

1.1 文件类构造函数CStdioFile

文件类构造函数CStdioFile(LPCTSTR lpszFileName,UINT nOpenFlags),其中,第一个参数为创建文件的文件名,第二个参数则为文件打开模式。常用的模式有4种:①CFile::modeRead以只读的方式打开;②CFile::modeWrite则以可写的方式打开;③CFile::modeReadWrite以读写方式打开;④CFile::modeCreate创建并打开。以上模式均可组合使用,并用“|”相互隔开。

1.2 CArchive::Write

CArchive::Write(const void* lpBuf,UINT nMax),向文件中写入字符串,参数1是一个向用户提供缓存的指针,该缓存包含需要写入文件中的数据;参数2为一个无符号的整数,用于表示写入数据的字节数。

CFileFind类是MFC中用作搜索文件的类。CFileFind类不但可用于搜索本地文件,也可以用于搜索网络文件。通过向其传递文件名和文件路径等参数,即可实现文件的搜索功能。CFileFind类的主要方法有以下4种:①CFileFind,构造CFliefind对象;②GetFileName,可以获取搜索到带有扩展名的相关文件;③GetFilePath,可以获取搜索到的文件的路径;④FindNextFile,继续先前的搜索调用等。

本文文件搜索功能主要是基于CFile和CFileFind两个基类实现的。

2 基于文件搜索功能的图像融合程序

2.1 设计思路

该程序是通过调用控制台应用程序enblend,利用enblend自带的图像融合功能,对两幅或两幅以上的图像进行融合。图像融合不是本文的讨论重点,所以不在此赘述,有兴趣的读者可以查阅相关资料。

调用一个控制台应用程序的方法有很多,比如,在VC 中直接通过调用函数实现,但是,这种方法在需要传递复杂参数或数据量较大的情况下,会出现调用失败或者运行时间过长的情况,甚至会因为占用太多内存而出现系统崩溃的状况,使得简单问题复杂化。最简单的调用方法就是新建一个bat批处理文件,通过运行批处理文件达到调用控制台程序的目的。这种方法方便、快捷,在处理大量数据时尤为高效,但是,每次调用都需要手动重新编写批处理文件,费事费力而且容易出错。因此,现在的问题就转变为如何设计一个用户界面,让用户只需要点击鼠标即可完成创建bat文件并调用控制台程序的过程。

2.2 实现流程

该程序的开发环境为Visual C++ 6.0,利用MFC创建一个对话框应用程序,通过点击对话框按钮实现此程序的功能。

要实现程序功能的具体做法是:新建一个MFC AppWizard工程文件,文件名可以取为“FindImg”,选择基本对话框应用程序类型,点击完成。在生成的对话框界面上,新建一个编辑框和两个按钮,两个按钮的名称分别修改为“选择文件夹”“融合图像”。编辑框用于显示所选取文件夹的路径;“选择文件夹”按钮用于选取图像所在的文件夹,并搜索该文件夹下的所有图片文件,然后将其写入bat文件;“融合图像”按钮用于运行bat文件,调用enblend对图像进行融合。endprint

搜素图片文件功能的实现的步骤是双击“选择文件夹”按钮,添加代码如下(//后为对该行代码的解释):

void CDfsDlg::OnSlectFile()

{ CString str;

char m_ImageDir[512];

CString m_Path;

CFileFind find;

CStdioFile file("find.bat",CFile::modeCreate|CFile::mod eReadWrite);

//新建一个文件名为“find”的bat文件,文件模式为读写;

file.Write("cd \\enblend所在文件夹路径\n",strlen("cd \\enblend所在文件夹路径\\n"));

//在bat文件中写入数据,调用enblend控制台程序;

BROWSEINFO bi;//创建选择文件夹对话框;

TCHAR name[MAX_PATH];

name[0]='d';

ZeroMemory(&bi,sizeof(BROWSEINFO));

bi.hwndOwner=GetSafeHwnd();

bi.pszDisplayName=name;

bi.lpszTitle=_T("Select folder");//设置选择文件夹对话框的标题;

bi.ulFlags=0x80;

LPITEMIDLIST idl=SHBrowseForFolder(&bi);

if(idl==NULL)

return;

SHGetPathFromIDList(idl,str.GetBuffer(MAX_PATH));

str.ReleaseBuffer();

m_Path=str;

if(str.GetAt(str.GetLength()-1)!='\\')

m_Path+="\\";

UpdateData(FALSE);

Memcpy(m_ImageDir,m_Path,m_Path.GetLength());//获取文件夹路径字串;

m_ImageDir[m_Path.GetLength()]='\0';//字串一定要以\0结尾,否则程序会报错;

SetDlgItemText(IDC_LUJING, m_ImageDir);//将文件夹路径显示到编辑框中;

strcat(m_ImageDir,"*.tif");

//由于enblend只能读取tif格式的图像,所以,程序要搜索该文件夹所有tif格式的图像;

bool finded;

finded=find.FindFile(m_ImageDir);

while(finded)

//如果直接将FindFile的返回值作为判断条件的话,不仅搜索结果会少1个图片文件,而且当文件夹内没有图片时,程序也会出错;

{ finded=find.FindNextFile();

CString text=find.GetFileName();

text+="\n";

file.Write(text,text.GetLength());}

file.Write("\npause",strlen("\npause"));//把查找到的结果写入bat文件内;

MessageBox(“输入图片成功!”);

//数据成功写入bat文件,弹出消息框,提示用户图像输入成功;

file.Close();//程序运行结束,清理内存中的文件;}

调用控制台应用程序实现的步骤是双击“图像融合”按钮,添加点击按钮的事件响应代码,具体情况如下:

void CDfsDlg::OnBlendImg()

{ WinExec("..\\FindImg \\find.bat",SW_SHOWNORMAL);

//用WInExec函数调用bat,从而达到运行enblend程序融合图像的目的;}

编写完以上全部源代码后,便可以编译运行程序,点击“选择文件夹”按钮便可以搜索获取任意文件夹下的所有图片,并将其传递给enblend图像融合程序。点击“图像融合”按钮,便可调用enblend程序完成图像融合的过程。实验证明,该程序操作简单,运行性能良好,在数据量较大的情况下,运行速度依然较快。

3 总结

本文着重讨论了基于文件搜索功能下图像融合程序的实现过程,事实上,基于文件搜索功能可以实现很多具有其他功能的程序,文中的图像融合只是其中一个方面的应用。因为绝大多数的应用程序都需要读入文件数据来实现自身的实际功能,文件搜索功能可以实现程序读入文件数据的自动化,极大地提高了应用程序的工作效率和用户友好度,所以说,该程序值得开发者广泛应用。

参考文献

[1]宋坤,刘锐宁,李伟明.MFC程序开发参考大全[M].北京:人民邮电出版社,2007.

————————

作者简介:何源(1990—),男,现就读于山西农业大学,主要从事资源环境遥感方面的研究。

〔编辑:白洁〕endprint

猜你喜欢
应用程序
浅谈重大火灾隐患自动判定应用程序研发及成效
删除Win10中自带的应用程序
谷歌禁止加密货币应用程序
儿童应用程序4岁也能做设计
应用程序打包:让移动应用管理更安全的关键
为Fire电视棒安装应用
开发自己的智能手机应用程序
驱蚊APP让蚊子远离你
三星电子将开设应用程序下载商店
微软软件商店开始接受应用程序