Pregunta

He estado tratando de serializar y deserializar BitmapImages. He estado usando métodos que supuestamente obras que he encontrado en este tema: error en mi byte [] para la conversión de WPF BitmapImage?

Sólo para repetir lo que está pasando, aquí es parte de mi código de serialización:

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

Y aquí está el código deserialización:

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

Además, no estoy seguro si importa, pero antes, cuando poblaron mi diccionario I codificada mapas de bits con PngBitmapEncoder conseguirlos en BitmapImages. Así que no sé si es por ambos codificación tiene algo que ver con ello. Aquí está el método que hace eso:

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

Así que el problema es, la serialización y deserialización funciona bien. No hay errores, y el diccionario tiene entradas con lo que parece ser BitmapImages, sin embargo su anchura / altura y algunas otras propiedades se ajustan a '0' cuando miro en el modo de depuración. Y, por supuesto, no se muestra nada cuando trato de mostrar las imágenes.

Así que cualquier idea de por qué no se deserializan correctamente?

Gracias!

¿Fue útil?

Solución

1) no debe deshacerse MemoryStream, utilizado desde la inicialización de la imagen. Quitar using en esta línea

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

2) Después

encoder.Save(ms);

Trate de añadir

ms.Seek(SeekOrigin.Begin, 0);
ms.ToArray();
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top