之前已经有很多大佬写过了,而且有很多的资料。我就简单的说一下我走过的坑吧,免得更多人掉坑里。
先说一下我的需求,手里有一份海洋卫星的HDF5数据,想要借助idl的影像处理功能,得到一幅较好的卫星影像。
材料:已备好idl处理程序(上一篇博文有介绍)
一、刚开始,想的是把idl程序,打包成exe文件,然后在程序里调用exe,传入参数,处理图像,这想法,本来完美。于是,我按照资料一步一步走,具体链接:
http://blog.sina.com.cn/s/blog_764b1e9d0102xn80.html(这个博客对于初学者有很大的帮助)
ok,生成exe之后,这一切,都没问题。直到我开始运行exe。提示我“找不到指定的ENVI模块”???????仔细查找之后才发现,还有这样一段话
emmmmmm.................
好吧,改成我自己的idl地址之后,o?果然可以。但是,当我把软件拷贝给别人时,总不能先改配置文件吧。就算是可以修改配置文件,那万一别人没有安装idl呢?不行不行。。。要不重新编写idl程序,不使用ENVI函数?可是envi函数真的很好用啊!只好另寻他法....
2、采用C# idl混合开发,调用COM_idl_connect.dll,直接调用编译过后的pro文件。虽然说这样会泄露代码,并且不具备安全性,但是。。。先试试吧
代码如下:
string yxtFullPath = "";
try
{
OpenFileDialog ofd = new OpenFileDialog();
ofd.Title = "请选择(L1B)影像文件";
ofd.InitialDirectory = Config.workspace;
ofd.Filter = "H5文件|*.h5";
ofd.RestoreDirectory = true;
ofd.FilterIndex = 1;
if (ofd.ShowDialog() == DialogResult.OK)
{
yxtFullPath = ofd.FileName;
COM_IDL_connectLib.COM_IDL_connectClass oCOMIDL = new COM_IDL_connectLib.COM_IDL_connectClass();
oCOMIDL.CreateObject(0, 0, 0);
string varPath = yxtFullPath;
string workspacePath = Config.workspace;
string currentCommand = ".compile '" + Application.StartupPath.ToString() + @"\readH5.pro'";
oCOMIDL.ExecuteString(currentCommand);
oCOMIDL.ExecuteString("readH5,'" + varPath + "','" + workspacePath + "'");
MessageBox.Show("影像处理完成!");
OpenYXTRaster(workspacePath + @"\END_GLT.dat");
}
}
catch (Exception ex)
{
throw ex;
}
ok,调用成功,但问题又来了,图像处理成功后,会直接返回一个“对COM组件的调用返回了错误HRESULT E_FAIL”问题,
参考董彦卿老师的博客,个人并建议,先在idl程序结尾加上
void=DIALOG_MESSAGE(!ERROR_STATE.MSG,/INFOR,TITLE='CW')
然后再调用pro文件,直接查看错误,再解决。
不管怎么说,废了半天劲,终于解决了,唉,我太笨了。。。。如有错误,希望各位指正。有需求再改吧,拜了个拜。。。。