Question

J'ai essayé de sérialisation et la désérialisation BitmapImages. Je me sers des méthodes qui fonctionne soi-disant que je trouvais dans ce fil: erreur dans mon octet [] à la conversion WPF BitmapImage?

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

En outre, je ne sais pas si ça compte, mais plus tôt quand je peuplaient mon dictionnaire, je bitmaps avec PngBitmapEncoder codé pour les entrer dans BitmapImages. Donc, pas sûr si double encodage a quelque chose à voir avec elle. Voici la méthode qui fait que:

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

Le problème est, sérialisation et désérialisation fonctionne très bien. Aucune erreur, et le dictionnaire contient des entrées avec ce qui semble être BitmapImages, mais leur largeur / hauteur et d'autres propriétés sont tous à « 0 » quand je les regarde en mode débogage. Et bien sûr, rien ne se montre lorsque je tente d'afficher les images.

Alors des idées pour expliquer pourquoi ils ne sont pas correctement désérialisé?

Merci!

Était-ce utile?

La solution

1) Vous ne devriez pas disposer MemoryStream, utilisé de l'image d'initialisation. Supprimer 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();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top