WPF BitmapImage Сериализация / десериализация - PullRequest
3 голосов
/ 30 ноября 2010

Я пытался сериализовать и десериализовать BitmapImages. Я использую методы, которые предположительно работают, которые я нашел в этой теме: ошибка в преобразовании моего байта [] в WPF BitmapImage?

Просто чтобы повторить то, что происходит, вот часть моего кода сериализации:

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

А вот код десериализации:

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

Кроме того, я не уверен, имеет ли это значение, но ранее, когда я заполнял свой словарь, я кодировал растровые изображения с помощью PngBitmapEncoder, чтобы получить их в BitmapImages. Поэтому не уверен, что двойное кодирование как-то связано с этим. Вот метод, который делает это:

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

Так что проблема в том, что сериализация и десериализация работает нормально. Нет ошибок, и в словаре есть записи с тем, что кажется BitmapImages, однако их ширина / высота и некоторые другие свойства устанавливаются в «0», когда я смотрю на них в режиме отладки. И, конечно, при попытке отобразить изображения ничего не отображается.

Так есть какие-нибудь идеи относительно того, почему они не десериализованы должным образом?

Спасибо!

1 Ответ

6 голосов
/ 30 ноября 2010

1) Не следует утилизировать MemoryStream, использованный при инициализации изображения.Удалите using в этой строке

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

2) После

encoder.Save(ms);

Попробуйте добавить

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