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

What happens if CImage::Load method fails?

本文关键字:什么 失败 CImage Load 方法 如果      更新时间:2023-10-16

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

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

查看CImage::Load (atlimage.h)的源代码可以发现,加载图像失败会破坏先前存储的图像。两个Load过载最终调用到CImage::CreateFromGdiplusBitmap。这个类成员执行两个操作:它调用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;
}