如果CImage :: Load方法失败会发生什么?

时间:2015-10-24 10:10:57

标签: c++ api mfc atl

如果CImage的像素尝试加载另一个图像,并且加载方法失败,会改变它吗?

1 个答案:

答案 0 :(得分:4)

异常保证没有记录,所以你不能假设任何事情。

查看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;
}