2012-11-16 27 views
1

我試圖在XML文件中保存和加載ImageSource(或BitmapSource)。快速看看SO給了我this answer以XML格式保存ImageSource(BitmapSource)

它看起來不錯,所以我試了一下,但我得到了一個奇怪的結果。

當我嘗試這個代碼一切正常:

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png"))); 
BackgroundImage = testImgSrc; 

但是當我嘗試這個代碼的圖像只是不會出現在所有:

似乎
BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png"))); 
string testImgStr = ImageToBase64(testImgSrc); 
BitmapSource testImg = Base64ToImage(testImgStr); 
BackgroundImage = testImg; 

有不被任何錯誤或例外。在逐步完成代碼BackgroundImage時,它看起來像被設置爲有效的圖像對象。

我的WPF窗體有一個圖像控件,它的源綁定到一個屬性,該屬性返回BackgroundImage屬性的結果。我猜測綁定工作正常,因爲第一個測試按預期工作。

任何人都可以幫助我理解爲什麼第二個測試不顯示我的圖像?

回答

4

this answerBase64ToImage方法有問題。 documentation指出,使用默認的OnDemand緩存選項時,在實際使用圖像之前,不能關閉流。在你的情況下,這意味着Image元素正試圖訪問已處理的流。

的修復程序很簡單,你只需要緩存選項更改爲OnLoad,問題就消失了:

BitmapSource Base64ToImage(string base64) 
{ 
    byte[] bytes = Convert.FromBase64String(base64); 
    using (var stream = new MemoryStream(bytes)) 
    { 
     return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
    } 
}