2015-10-24 211 views
4

如果CImage的像素嘗試加載其他圖像並且加載方法失敗,那麼它的像素是否會被更改?如果CImage :: Load方法失敗會發生什麼情況?

+1

你嘗試一下了嗎? –

+1

@πάνταῥεῖ:測試失敗並不像聽起來那麼簡單。加載可能會失敗,原因很多:圖像文件可能不存在,文件可能無法從當前用戶訪問,圖像文件可能具有不受支持或無效的文件格式,應用程序內存不足等等。其中一些錯誤條件不會破壞先前加載的圖像,而其他錯誤條件將會破壞。 – IInspectable

+0

@πάνταῥεῖ我試過了,失敗了,像素保持不變。 – iouvxz

回答

4

異常保證沒有記錄,所以你不能假設任何東西。

查看CImage::Loadatlimage.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; 
} 
+0

謝謝,這正是我需要的。 – iouvxz

+0

此外,您可以使用'CImage :: IsNull()'來檢查代碼中的加載是否成功。 –

相關問題