如果 CImage::Load 方法失败会怎样?
What happens if CImage::Load method fails?
如果 CImage 尝试加载另一张图片并且加载方法失败,它的像素是否会被更改?
未记录异常保证,因此您不能假设任何事情。
查看 CImage::Load
(atlimage.h) 的源代码表明,未能加载图像会破坏先前存储的图像。两个 Load
重载最终都会调用 CImage::CreateFromGdiplusBitmap
。此 class 成员执行两个操作: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 尝试加载另一张图片并且加载方法失败,它的像素是否会被更改?
未记录异常保证,因此您不能假设任何事情。
查看 CImage::Load
(atlimage.h) 的源代码表明,未能加载图像会破坏先前存储的图像。两个 Load
重载最终都会调用 CImage::CreateFromGdiplusBitmap
。此 class 成员执行两个操作: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;
}