用CImage类的Load函数load一个图像文件时Fail了

jieliqun 2010-12-17 03:20:21
想打开一个图像并显示出来,用CImage类,但是调用CImage::Load()时,返回值是Fail。系统用的是Win7,在VS2008和VS2010上都试过,跟踪查看发现,bmSrc.GetLastStatus() 返回的值是InvalidParameter(其中InvalidParameter = 2)
下面是Load函数
inline HRESULT CImage::Load(_In_z_ LPCTSTR pszFileName) throw()
{
if( !InitGDIPlus() )
{
return( E_FAIL );
}

Gdiplus::Bitmap bmSrc( (CT2W)pszFileName );
if( bmSrc.GetLastStatus() != Gdiplus::Ok ) {
return( E_FAIL );
}

return( CreateFromGdiplusBitmap( bmSrc ) );
}
不知道是为什么,以前在XP系统下面跑过都没有问题的,谁能帮忙看下,谢谢啦!
...全文
1890 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
海xs 2013-08-02
  • 打赏
  • 举报
回复
,感谢楼主
jiakunjk2006 2013-03-21
  • 打赏
  • 举报
回复
其实只要把hResult = m_Image.Load(dlg.GetFileName())中GetFileName变为GetPathName就行了
zhaolianyun 2012-10-16
  • 打赏
  • 举报
回复
呵呵,灰常感谢楼主
向立天 2010-12-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 jieliqun 的回复:]
不解诶
怎么试啊


引用 5 楼 xianglitian 的回复:
会不会跟权限有关
你用管理员权限试一下
[/Quote]
右键管理员运行
jieliqun 2010-12-21
  • 打赏
  • 举报
回复
不解诶
怎么试啊

[Quote=引用 5 楼 xianglitian 的回复:]
会不会跟权限有关
你用管理员权限试一下
[/Quote]
jieliqun 2010-12-21
  • 打赏
  • 举报
回复
谢谢~~ 终于可以跑起来了
不过为什么Win7会这样

[Quote=引用 7 楼 chuan_zige 的回复:]
我找到了不知道正确不的答案,呵呵~~~~~
如下:假设我们定义的成员变量m_Image;
改前的源代码:就是网上很容易收到的那个哈~~
void CEx_ImageView::OnFileOpen()
{
 CString strFilter;
 CSimpleArray<GUID> aguidFileTypes;
 HRESULT hResult;

 // 获取CImage支……
[/Quote]
chuan_zige 2010-12-20
  • 打赏
  • 举报
回复
遇到同样的问题啊!!!!!
chuan_zige 2010-12-20
  • 打赏
  • 举报
回复
我找到了不知道正确不的答案,呵呵~~~~~
如下:假设我们定义的成员变量m_Image;
改前的源代码:就是网上很容易收到的那个哈~~
void CEx_ImageView::OnFileOpen()
{
 CString strFilter;
 CSimpleArray<GUID> aguidFileTypes;
 HRESULT hResult;

 // 获取CImage支持的图像文件的过滤字符串
 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "All Image Files") );
 if (FAILED(hResult))
{
  MessageBox(L"GetExporterFilter调用失败!");
  return;
 }
 CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
 if(IDOK != dlg.DoModal())
  return;

 m_Image.Destroy();
 // 将外部图像文件装载到CImage对象中
 hResult = m_Image.Load(dlg.GetFileName());
 if (FAILED(hResult)) {
  MessageBox(L"调用图像文件失败!");
  return;
 }

 // 设置主窗口标题栏内容
 CString str;
 str.LoadString(AFX_IDS_APP_TITLE);
 AfxGetMainWnd()->SetWindowText(str + L" - " +dlg.GetFileName());

 Invalidate(); // 强制调用OnDraw
}


OnDraw函数如下:
void CEx_ImageView::OnDraw(CDC* pDC)
{
 CEx_ImageDoc* pDoc = GetDocument();
 ASSERT_VALID(pDoc);
 if (!m_Image.IsNull())
{
  m_Image.Draw(pDC->m_hDC,0,0);
 }
}

问题就出在 hResult = m_Image.Load(dlg.GetFileName());这一句,跟踪结果是hResult为E_FAIL。
解决办法:我尝试这样是可行的
CString PathName("C:\\Users\\Administrator\\Desktop\\t\\.bmp");//我的图片p.bmp放在桌面的文件夹t中
m_Image.load(PathName);
这样就可以显示图片,注意到我们在路径间使用的是“\\”,不然编译有warnning。
而上面的程序中,用的事 hResult = m_Image.Load(dlg.GetFileName());
可以用Textout看dlg.GetFileName()的结果,我们发现这有图片名字(我的是p.bmp);
总结起来,我用下面的方法重新改正了路径:
把上面的CEx_ImageView::OnFileOpen()函数做适当的修改,如下:
void CEx_ImageView::OnFileOpen()
{
 CString strFilter;
 CSimpleArray<GUID> aguidFileTypes;
 HRESULT hResult;

 // 获取CImage支持的图像文件的过滤字符串
 hResult = m_Image.GetExporterFilterString(strFilter,aguidFileTypes,_T( "All Image Files") );
 if (FAILED(hResult))
{
  MessageBox(L"GetExporterFilter调用失败!");
  return;
 }
 CFileDialog dlg(TRUE, NULL, NULL, OFN_FILEMUSTEXIST, strFilter);
 if(IDOK != dlg.DoModal())
  return;

 m_Image.Destroy();
 
 Path=dlg.GetFolderPath();
Name=dlg.GetFileName();

CString PathName;
CString Link;
Link=L"\\\\";//这就是表示“\\”
PathName=Path+Link+Name;//在路径与文件名之间加“\\”
hResult=m_Image.Load(PathName);// 将外部图像文件装载到CImage对象中
 if (FAILED(hResult))
{
  MessageBox(L"调用图像文件失败!");
  return;
 }

 // 设置主窗口标题栏内容
 CString str;
 str.LoadString(AFX_IDS_APP_TITLE);
 AfxGetMainWnd()->SetWindowText(str + L" - " +dlg.GetFileName());

 Invalidate(); // 强制调用OnDraw
}

结果能打开图片了!!!
整了好久,网上找了好多都没看到办法。估计是高手不屑吧,呵呵~~~~~
想来可能是win7的缘故吧,应为跟踪时有一句就是判断系统的,这就不说了哈~~~~~



fandh 2010-12-20
  • 打赏
  • 举报
回复
win7里面,好多都与权限有关!
向立天 2010-12-20
  • 打赏
  • 举报
回复
会不会跟权限有关
你用管理员权限试一下
m_tornado 2010-12-17
  • 打赏
  • 举报
回复
不至于吧,win 7也没理由错啊~
你载入的代码~贴
jieliqun 2010-12-17
  • 打赏
  • 举报
回复
不是我写的 引用了atlimage.h
#include <atlimage.h>
[Quote=引用 1 楼 m_tornado 的回复:]
CImage不是已经集成的类么,你是自己写的?
[/Quote]
m_tornado 2010-12-17
  • 打赏
  • 举报
回复
CImage不是已经集成的类么,你是自己写的?

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧