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!
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
Fortune) Il semble que nous faisons la même chose. –
Vous cherchez des éclaircissements à ce sujet. Est-ce que la solution pour changer ms.GetBuffer() à ms.GetArray() après avoir cherché au début? –