VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 531|回复: 4

Image图像文件保存的问题

[复制链接]
98_avatar_middle
最佳答案
0 
在线会员 发表于 2019-6-3 13:17:51 | 显示全部楼层 |阅读模式
3驿站币
我在学MFC,最近在跟着做学长的一个demo。在文件保存中遇到问题
代码
CString path = CMyFile::Show();        //保存文件的路径名
        MessageBox(path);             //点击取消,path路径为空


。。。
//保存图像
        path = path + filename;                //得到最终的带有文件名和扩展名的保存路径    ,filename是根据采集次数自动生成的
        HRESULT hResult = image.Save(path);
        if (FAILED(hResult)||(path.IsEmpty()))
        {
                MessageBox(_T("保存图像文件失败!"));
        }
        else
        {
                MessageBox(_T("保存图像文件成功!"));
                MessageBox(path);
        }

TIM截图20190603103440.jpg

MessageBox(path);

MessageBox(path);

点击取消

点击取消




上一篇:虚拟聊天室程序
下一篇:MFC用子窗口的IDCANCEL按钮关闭父窗口和子窗口
98_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-6-3 13:20:00 | 显示全部楼层
||(path.IsEmpty())这里是我之前判断添加的
77_avatar_middle
最佳答案
31 
online_vip 发表于 2019-6-3 16:35:37 | 显示全部楼层
楼主想问啥?
98_avatar_middle
最佳答案
0 
ico_lz  楼主| 发表于 2019-6-3 17:27:40 | 显示全部楼层

我两段相同的代码,为什么都是点击文件保存框的取消,但操作过程一样,但两个程序执行的结果不一样,HRESULT的接收值一个是E_FAIL,一个是S_OK,预期的结果是保存文件时应该是根据HRESULT的值返回保存失败,但我这边执行是保存不管怎么样都保存成功
75_avatar_middle
最佳答案
0 
在线会员 发表于 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("保存图像文件成功!"));
}
   


您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-9-19 23:06

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表