读书人

Gdiplus:Image:FromFile(.)没法读入文

发布时间: 2014-06-05 16:15:21 作者: rapoo

Gdiplus::Image::FromFile(..)无法读入文件?
我的代码如下:
int __fastcall CTestDlg::SetTransparent(LPWSTR lpSkinFile, int nTran)
{
int Width,Height;
m_Image=Gdiplus::Image::FromFile(lpSkinFile); // Use GDI+ load image
Width = m_Image->GetWidth();
Height = m_Image->GetHeight();
...
}
一到这里就显示: "Unhandled exception in Test.exe:0xc0000005:Access exception."

其中lpSkinFile的值用SetTransparent(L"F:\\Test\\Debug\\a.png", 100);传递的,我加入断点后调试,发现m_Image在之前的值是0xcccccccc,执行到 m_Image=Gdiplus::Image::FromFile(lpSkinFile);后就变为0x00000000; 后来我试图从流中读取,代码如下:
void CTestDlg::InitialImage(LPWSTR path , Image *image)
{
char name[MAX_PATH];
WideCharToMultiByte(CP_UTF8,0,path,-1,name,strlen(name),0,0);

CFile file;
try
{
file.Open (path,CFile::modeRead|CFile::typeBinary);
}
catch(CFileException *p)
{
p->ReportError();
return;
}
DWORD len = file.GetLength ();// 申请全局空间
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, len);
BYTE* pmem = (BYTE*)GlobalLock(hMem);
file.ReadHuge (pmem,len);// 从文件读出来。
IN IStream* pstm;
CreateStreamOnHGlobal(hMem,FALSE,&pstm);
image=Gdiplus::Bitmap::FromStream(pstm);// 从流加载
GlobalUnlock(hMem);
GlobalFree(hMem);
pstm->Release();
file.Close ();
}
我把m_Image=Gdiplus::Image::FromFile(lpSkinFile);换为m_Image=InitialImage(lpSkinFile,m_Image);发现和上面的问题一样;再后来,我用Bitmap类代替Image类发现还是不行,为什么呢? 请问这样问题如何解决,大家帮帮忙啊,谢谢了!

[解决办法]
也许文件名无效或者不是可识别的图形。可以看一下GDIPlus的状态值。
[解决办法]
感觉WideCharToMultiByte(CP_UTF8,0,path,-1,name,strlen(name),0,0); 这个函数在做WCHAR*转换path字符的时候出错,所以后面你open的时候文件名就出错了。

[解决办法]
应该是你的文件路径的问题,导致加载文件失败,而你又不加判断得使用了指针m_Image

读书人网 >VC/MFC

热点推荐