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

4

如果CImage尝试加载另一张图片,但加载方法失败了,它的像素会被改变吗?


1
你已经试过了吗? - πάντα ῥεῖ
1
@πάνταῥεῖ:测试失败并不像你说的那么容易。加载可能因为多种原因而失败:图像文件可能不存在,该文件可能无法从当前用户访问,图像文件可能具有不受支持或无效的文件格式,应用程序可能耗尽内存等等。其中一些错误条件不会破坏先前加载的图像,而其他错误则会。 - IInspectable
@πάντα ῥεῖ 我尝试了,但失败了,像素仍然没有改变。 - iouvxz
1个回答

5
异常保证并未记录在文档中,因此您不能做出任何假设。
查看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;
}

谢谢,这正是我所需要的。 - iouvxz
此外,您可以使用 CImage::IsNull() 在代码的不同位置检查加载是否成功。 - Michael Plautz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接