WPF BitmapFrame для BitmapImage - PullRequest
       44

WPF BitmapFrame для BitmapImage

0 голосов
/ 27 ноября 2018

У меня есть BitmapFrame от десериализации.Мне нужно преобразовать это в BitmapImage.Как это сделать?Я использовал этот код:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/31808363-6b00-43dd-8ea8-0917a35d62ad/how-to-convert-stream-to-bitmapsource-and-how-to-convert-bitmapimage-to-bitmapsource-in-wpf?forum=wpf

Проблема в том, что BitmapImage не имеет свойства Source, только StreamSource или UriSource.

часть сериализации:

public void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            MemoryStream stream = new MemoryStream();
            JpegBitmapEncoder encoder = new JpegBitmapEncoder();
            encoder.Frames.Add(BitmapFrame.Create(image.UriSource));
            encoder.QualityLevel = 30;
            encoder.Save(stream);
            stream.Flush();
            info.AddValue("Image", stream.ToArray());
...

десериализация:

public ImageInfo(SerializationInfo info, StreamingContext context)
        {
            //Deserialization Constructorbyte[] encodedimage = (byte[])info.GetValue("Image", typeof(byte[]));
            if (encodedimage != null)
            {
                MemoryStream stream = new MemoryStream(encodedimage);
                JpegBitmapDecoder decoder = new JpegBitmapDecoder(stream, BitmapCreateOptions.None, BitmapCacheOption.Default);
                Image = new BitmapImage();
                Image.BeginInit();
                //Image.StreamSource = ...  decoder.Frames[0];
                Image.EndInit();
                Image.Freeze();
            }
...

Мне нужно что-то эффективное вместо комментария выше ...

1 Ответ

0 голосов
/ 27 ноября 2018

Кроме того, вам на самом деле не нужно это преобразование (поскольку вы можете использовать BitmapFrame везде, где вы в противном случае используете BitmapImage), вы можете напрямую декодировать BitmapImage из закодированного растрового изображения в байтовом массиве.

Нет необходимости явно использовать BitmapDecoder.Когда вы присваиваете Stream свойству StreamSource BitmapImage, фреймворки автоматически используют соответствующий декодер.Вы должны позаботиться о том, чтобы установить BitmapCacheOption.OnLoad, когда поток должен быть закрыт сразу после создания BitmapImage.

Image = new BitmapImage();
using (var stream = new MemoryStream(encodedimage))
{
    Image.BeginInit();
    Image.CacheOption = BitmapCacheOption.OnLoad;
    Image.StreamSource = stream;
    Image.EndInit();
}
Image.Freeze();
...