|
发表于 2019-6-4 11:44:11
|
显示全部楼层
1、CImage图像,其实质是gdi+图像库。圈选择Save,右键转到定义,这是它源码,这里中文注释是为了说明我添加地。
inline HRESULT CImage::Save(
_In_z_ LPCTSTR pszFileName,
_In_ REFGUID guidFileType) const throw()
{
//初始gdi+错,返回E_FAIL
if( !InitGDIPlus() )
{
return( E_FAIL );
}
UINT nEncoders;
UINT nBytes;
Gdiplus::Status status;
//获取图像编码器数据大小错,返回E_FAIL
status = Gdiplus::GetImageEncodersSize( &nEncoders, &nBytes );
if( status != Gdiplus::Ok )
{
return( E_FAIL );
}
//分配编码器空间错,返回E_OUTOFMEMORY
USES_CONVERSION_EX;
Gdiplus::ImageCodecInfo* pEncoders = static_cast< Gdiplus::ImageCodecInfo* >( _ATL_SAFE_ALLOCA(nBytes, _ATL_SAFE_ALLOCA_DEF_THRESHOLD) );
if( pEncoders == NULL )
return E_OUTOFMEMORY;
//载入编码器错, 返回E_FAIL
status = Gdiplus::GetImageEncoders( nEncoders, nBytes, pEncoders );
if( status != Gdiplus::Ok )
{
return( E_FAIL );
}
//查找编码clsid,空,返回E_FAIL
CLSID clsidEncoder = CLSID_NULL;
if( guidFileType == GUID_NULL )
{
// Determine clsid from extension
clsidEncoder = FindCodecForExtension( ::PathFindExtension( pszFileName ), pEncoders, nEncoders );
}
else
{
// Determine clsid from file type
clsidEncoder = FindCodecForFileType( guidFileType, pEncoders, nEncoders );
}
if( clsidEncoder == CLSID_NULL )
{
return( E_FAIL );
}
//文件名处理,转换UNICODE错返回E_OUTOFMEMORY
LPCWSTR pwszFileName = T2CW_EX( pszFileName, _ATL_SAFE_ALLOCA_DEF_THRESHOLD );
#ifndef _UNICODE
if( pwszFileName == NULL )
return E_OUTOFMEMORY;
#endif // _UNICODE
//32位图像,存盘错,返回E_FAIL
if( m_bHasAlphaChannel )
{
ATLASSUME( m_nBPP == 32 );
Gdiplus::Bitmap bm( m_nWidth, m_nHeight, m_nPitch, PixelFormat32bppARGB, static_cast< BYTE* >( m_pBits ) );
status = bm.Save( pwszFileName, &clsidEncoder, NULL );
if( status != Gdiplus::Ok )
{
return( E_FAIL );
}
}
//24位图像存盘错,返回E_FAIL
else
{
Gdiplus::Bitmap bm( m_hBitmap, NULL );
status = bm.Save( pwszFileName, &clsidEncoder, NULL );
if( status != Gdiplus::Ok )
{
return( E_FAIL );
}
}
//保存正确
return( S_OK );
}
它的返回值只有3个可能,E_FAIL,S_OK,E_OUTOFMEMORY
保存失败除了文件名,还有文件格式
2、path.IsEmpty()判断不应放在那。应该在save前,文件名为空了还存,是获取不到返回值地,只能捕获 throw()
异常。该函数后能 throw()
if(!path.IsEmpty()){
HRESULT hResult = image.Save(path);
if(hResult !=S_OK) MessageBox(_T("保存图像文件失败!"));
else MessageBox(_T("保存图像文件成功!"));
}
|
|