【问题标题】:What happens if CImage::Load method fails?如果 CImage::Load 方法失​​败会发生什么?
【发布时间】:2016-01-23 20:29:15
【问题描述】:

如果CImage 尝试加载另一张图片并且加载方法失败,是否会更改其像素?

【问题讨论】:

  • 你试过了吗?
  • @πάνταῥεῖ:测试失败并不像你说的那么容易。加载失败的原因有很多:图像文件可能不存在、当前用户可能无法访问该文件、图像文件的文件格式不受支持或无效、应用程序内存不足等。其中一些错误条件不会破坏之前加载的图像,而其他错误条件会。
  • @πάντα ῥεῖ 我试过了,它失败了,像素保持不变。

标签: c++ api mfc atl


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这正是我需要的。
  • 另外,您可以使用CImage::IsNull() 在代码中的不同位置检查加载是否成功。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 2018-10-07
  • 1970-01-01
相关资源
最近更新 更多