2010-11-29 8 views
3

J'ai essayé de sérialiser et de désérialiser BitmapImages. Je me sers des méthodes qui travaille soi-disant que je trouvais dans ce fil: error in my byte[] to WPF BitmapImage conversion?WPF BitmapImage Sérialisation/désérialisation

Juste pour itérer ce qui se passe, voici une partie de mon code sérialisation:

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

Et voici le code désérialisation :

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

aussi, je ne sais pas si ça compte, mais plus tôt quand je peuplaient mon dictionnaire, j'encodées bitmaps avec PngBitmapEncoder pour les entrer dans BitmapImages. Donc pas sûr si le double-encodage a quelque chose à voir avec ça. Voici la méthode qui fait cela:

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

Donc, le problème est, la sérialisation et la désérialisation fonctionne bien. Pas d'erreurs, et le dictionnaire a des entrées avec ce qui semble être BitmapImages, cependant leur largeur/hauteur et certaines autres propriétés sont tous mis à '0' quand je les regarde en mode débogage. Et bien sûr, rien n'est montré quand j'essaie d'afficher les images.

Donc, des idées quant à pourquoi ils ne sont pas correctement désérialisés?

Merci!

Répondre

6

1) Vous ne devez pas disposer de MemoryStream, utilisé à partir de l'initialisation de l'image. Retirer using dans cette ligne

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

2) Après

encoder.Save(ms); 

Essayez d'ajouter

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

Retour à nouveau pour me aider aujourd'hui, je vois, tu me DÉCÉDÉES DeflateStreams yeseterday si vous vous souvenez. Appliqué vos changements et maintenant cela fonctionne parfaitement, merci encore! – vesz

+0

Fortune) Il semble que nous faisons la même chose. –

+0

Vous cherchez des éclaircissements à ce sujet. Est-ce que la solution pour changer ms.GetBuffer() à ms.GetArray() après avoir cherché au début? –

Questions connexes