因课题研究需要将多幅图像读入并对每幅图像的相应像素进行一些处理和比较,我是在vs03.net下利用Cimage类编的程序,目前只知道怎样一次读入两幅图像,就是设置了一个bool变量m_f,然后根据其值的变化读入两幅图像,但如果要增加到N幅的话显然就不能用这种方法了,请教一下大家如何在我现有的程序基础上改变一下能够实现读入多幅图像呢?我目前的程序代码如下: void CImgApp::OnFileOpen() 

// TODO: 在此添加命令处理程序代码 
// TODO: 在此添加命令处理程序代码 
if(m_f == false) 

CString strFilter; 
CSimpleArray<GUID> aguidFileTypes; 
HRESULT hResult; 
    
hResult = CImage::GetExporterFilterString(strFilter,aguidFileTypes); 
if (FAILED(hResult)) { 
CString fmt; 
fmt.Format("GetExporterFilter failed:\n%x - %s", hResult, _com_error(hResult).ErrorMessage()); 
::AfxMessageBox(fmt); 
return; 
} CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter); 
dlg.m_ofn.nFilterIndex = m_nFilterLoad; 
hResult = (int)dlg.DoModal(); 
if(hResult != IDOK) { 
return; 
} m_nFilterLoad = dlg.m_ofn.nFilterIndex; 
imgOriginal.Destroy(); 
hResult = imgOriginal.Load(dlg.GetFileName()); 
if (FAILED(hResult)) { 
CString fmt; 
fmt.Format("Load image failed:\n%x - %s", hResult, _com_error(hResult).ErrorMessage()); 
::AfxMessageBox(fmt); 
return; 
} OpenDocumentFile(dlg.GetFileName()); 
m_f = true; 

else 

CString strFilter; 
CSimpleArray<GUID> aguidFileTypes; 
HRESULT hResult; 
    
hResult = CImage::GetExporterFilterString(strFilter,aguidFileTypes); 
if (FAILED(hResult)) { 
CString fmt; 
fmt.Format("GetExporterFilter failed:\n%x - %s", hResult, _com_error(hResult).ErrorMessage()); 
::AfxMessageBox(fmt); 
return; 
} CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter); 
dlg.m_ofn.nFilterIndex = m_nFilterLoad; 
hResult = (int)dlg.DoModal(); 
if(hResult != IDOK) { 
return; 
} m_nFilterLoad = dlg.m_ofn.nFilterIndex; 
imgOriginal1.Destroy(); 
hResult = imgOriginal1.Load(dlg.GetFileName()); 
if (FAILED(hResult)) { 
CString fmt; 
fmt.Format("Load image failed:\n%x - %s", hResult, _com_error(hResult).ErrorMessage()); 
::AfxMessageBox(fmt); 
return; 
} OpenDocumentFile(dlg.GetFileName()); 
m_f = false; 

} 之后是设置了三个Cimage对象img、img1和img2,前两个是我读入的图像,img2是我经过对前两个图像进行处理后得到并将要保存的图像,暂时也先初始化为读入的图像1 
CImgView::CImgView() { 
// TODO: 在此处添加构造代码 
   img=&(((CImgApp *)AfxGetApp())->imgOriginal); 
   img1=&(((CImgApp *)AfxGetApp())->imgOriginal1); 
   img2=&(((CImgApp *)AfxGetApp())->imgOriginal); 

解决方案 »

  1.   

    把CFileDialog设置为多选模式,然后使用GetFileNames获取文件列表,你程序中就可以循环读了。
      

  2.   

    呵呵,用csharp用多了,忘记了。
    vc下好像是GetStartPosition,GetNextFileName,这样可以得到所选择的所有文件。
    当然,设置为多选模式先。
      

  3.   

    CFileDialog fd(TRUE,NULL,NULL,OFN_HIDEREADONLY|
    OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT);   
    if(fd.DoModal()==IDOK)   
    {   
      POSITION pos = fd.GetStartPosition();   
      while(pos)   
      {   
        CString szFileName = fd.GetNextPathName(pos);   
        AfxMessageBox(szFileName);   
      }   
    }
      

  4.   

    谢谢啊!那这样的话是不是我相应的Cimage对象也得改呢?比如说我一次要读入30幅图片,那么就得分别定义30个Cimage对象?请问有什么更方便的方法呢,要是能像matlab那样定义一个多维数组直接解决就好了
      

  5.   

    Cimage对象也可以定义数组嘛
    不过这样内存肯定吃不消,一次加载30个,不知道平均有多大
    算法要优化
      

  6.   


    CImage不用改,只需要定义一个CImage的数组就可以了。
      

  7.   

    嗯,我最近用matlab试了一下倒是可以同时读入十几幅图片并进行处理,那在这里面该如何优化呢?C++里光这一大段代码都看着头疼