2010-11-29 4 views
3

Ich habe versucht, BitmapImages zu serialisieren und zu deserialisieren. Ich habe Methoden wurde verwendet, die angeblich arbeiten, die ich in diesem Thread gefunden: error in my byte[] to WPF BitmapImage conversion?WPF BitmapImage Serialisierung/Deserialisierung

einfach iterieren, was los ist, hier ist ein Teil meiner Serialisierung Code:

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); 
       } 

Und hier ist die Deserialisierung Code :

// 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); 
        } 

auch ich bin nicht sicher, ob es aber früher ankommt, wenn ich mein Wörterbuch bevölkerten ich codierte Bitmaps mit PngBitmapEncoder, um sie in BitmapImages zu bekommen. Also nicht sicher, ob Double-Encoding etwas damit zu tun hat. Hier ist die Methode, die das tut:

// 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; 
      } 
     } 

So ist das Problem, Serialisierung und Deserialisierung funktioniert gut. Keine Fehler, und das Wörterbuch hat Einträge mit scheinbar BitmapImages, aber ihre Breite/Höhe und einige andere Eigenschaften sind alle auf '0' gesetzt, wenn ich sie im Debugging-Modus ansehe. Und natürlich wird nichts angezeigt, wenn ich versuche, die Bilder anzuzeigen.

Also irgendwelche Ideen, warum sie nicht richtig deserialisiert sind?

Danke!

Antwort

6

1) Sie sollten MemoryStream, verwendet von Bildinitialisierung, nicht entsorgen. Entfernen using in dieser Linie

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

2) Nach

encoder.Save(ms); 

Versuchen Zugabe

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

Wieder zurück, mir zu helfen heute sehe ich, half man mir mit DeflateStreams yeseterday, wenn Sie sich erinnern. Habe deine Änderungen übernommen und jetzt funktioniert es einwandfrei, nochmals vielen Dank! – vesz

+0

Fortune) Es scheint, dass wir gleiche Dinge tun. –

+0

Auf der Suche nach einigen Erläuterungen zu diesem Thema. War die Lösung, um ms.GetBuffer() zu ms.GetArray() zu ändern, nach dem Suchen nach dem Start? –