2010-11-29 43 views
3

我一直在嘗試序列化和反序列化BitmapImages。我一直在使用方法據稱工作,我在這個線程發現:error in my byte[] to WPF BitmapImage conversion?WPF BitmapImage序列化/反序列化

只是爲了迭代是怎麼回事,這裏是我的序列化代碼的一部分:

using (MemoryStream ms = new MemoryStream()) 
       { 
        // This is a BitmapImage fetched from a dictionary. 
        BitmapImage image = kvp.Value; 

        PngBitmapEncoder encoder = new PngBitmapEncoder(); 
        encoder.Frames.Add(BitmapFrame.Create(image)); 
        encoder.Save(ms); 

        byte[] buffer = ms.GetBuffer(); 

        // Here I'm adding the byte[] array to SerializationInfo 
        info.AddValue((int)kvp.Key + "", buffer); 
       } 

這裏是反串行化代碼:

// While iterating over SerializationInfo in the deserialization 
// constructor I pull the byte[] array out of an 
// SerializationEntry 
using (MemoryStream ms = new MemoryStream(entry.Value as byte[])) 
        { 
         ms.Position = 0; 

         BitmapImage image = new BitmapImage(); 
         image.BeginInit(); 
         image.StreamSource = ms; 
         image.EndInit(); 

         // Adding the timeframe-key and image back into the dictionary 
         CapturedTrades.Add(timeframe, image); 
        } 

而且,我不知道,如果它的事項,但年初的時候我填充我的字典我編碼位圖與PngBitmapEncoder讓他們進入BitmapImages。所以不確定雙重編碼是否與它有關。這是這樣做的方法:

// Just to clarify this is done before the BitmapImages are added to the 
// dictionary that they are stored in above. 
private BitmapImage BitmapConverter(Bitmap image) 
     { 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       image.Save(ms, System.Drawing.Imaging.ImageFormat.Png); 
       BitmapImage bImg = new BitmapImage(); 
       bImg.BeginInit(); 
       bImg.StreamSource = new MemoryStream(ms.ToArray()); 
       bImg.EndInit(); 
       ms.Close(); 

       return bImg; 
      } 
     } 

所以問題是,序列化和反序列化工作正常。沒有錯誤,並且字典具有似乎是BitmapImages的條目,但是它們的寬度/高度和 當我在調試模式下查看它們時,其他一些屬性全部設置爲'0'。當然,當我嘗試顯示圖像時沒有任何顯示。

因此,有什麼想法,爲什麼他們沒有正確的反序列化?

謝謝!

回答

6

1)您不應該配置從映像初始化中使用的MemoryStream。在此行

using (MemoryStream ms = new MemoryStream(entry.Value as byte[])) 

2)拆下using

encoder.Save(ms); 

嘗試增加

ms.Seek(SeekOrigin.Begin, 0); 
ms.ToArray(); 
+0

再度回到今天我看到幫我,你DeflateStreams yeseterday如果你記得幫我。應用您的更改,現在它完美地工作,再次感謝! – vesz 2010-11-29 22:51:05