c++ - 如果 CImage::Load 方法失​​败会发生什么?

标签 c++ api mfc atl

请问CImage如果它尝试加载另一个图像并且加载方法失败,则它的像素会被更改?

最佳答案

没有记录异常保证,因此您不能假设任何事情。

查看 CImage::Load (atlimage.h) 的源代码表明,加载图像失败会破坏先前存储的图像。两个 Load 重载最终都调用了 CImage::CreateFromGdiplusBitmap。此类成员执行两个操作:1.) 它调用 Create 为图像创建新存储。这种操作是破坏性的。 2.) 它将源图像数据复制到目标中。此操作可能会失败。

由于您有一个操作可能会在破坏任何先前数据的操作之后失败,因此您不能假设加载图像失败会保留先前的图像数据。

以下代码实现了非破坏性的图像加载,首先将图像加载到临时文件中,只有在成功时才将其分配给目标:

HRESULT NonDestructiveLoad( CImage& img, const CString& fileName ) {
    CImage tempImage;
    HRESULT hr = tempImage.Load( fileName );
    if ( SUCCEEDED( hr ) ) {
        // The following operations cannot fail
        img.Destroy();
        img.Attach( tempImage.Detach() );
    }
    return hr;
}

关于c++ - 如果 CImage::Load 方法失​​败会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33316970/

相关文章:

c++ - 从Octave CLI构建mex文件

c++ - 如何使用 C++ 在 Windows Vista 中读取 NMEA 语句

java - Apple Autoingestion 类 : username and password "deprecated", 属性文件?

c++ - 非 unicode 程序的语言更改 ini 阅读

c++ - 重载小于 C++ 中的运算符出现错误

api - 如何使用cloudcontrol REST API进行身份验证

api - 使用 ffmpeg API : bigger filesize than ffmpeg. exe 进行 MPEG-2 视频编码

c++ - 我在为静态文本设置字体时遇到问题

c++ - 用于存储坐标的 float 或整数

C++ 模板 ByRef 与 ByVal