因课题研究需要将多幅图像读入并对每幅图像的相应像素进行一些处理和比较,我是在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);
}
{
// 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);
}
vc下好像是GetStartPosition,GetNextFileName,这样可以得到所选择的所有文件。
当然,设置为多选模式先。
OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT);
if(fd.DoModal()==IDOK)
{
POSITION pos = fd.GetStartPosition();
while(pos)
{
CString szFileName = fd.GetNextPathName(pos);
AfxMessageBox(szFileName);
}
}
不过这样内存肯定吃不消,一次加载30个,不知道平均有多大
算法要优化
CImage不用改,只需要定义一个CImage的数组就可以了。