Преобразовать поток памяти в BitmapImage?

У меня есть образ, который изначально был PNG, который я преобразовал в байт [] и сохранил в базе данных. Первоначально я просто читал PNG в поток памяти и преобразовывал поток в байт []. Теперь я хочу прочитать байт [] назад и преобразовать его в BitmapImage, чтобы я мог привязать к нему элемент управления WPF.

Я вижу много противоречивого и запутанного кода онлайн, чтобы выполнить задачу преобразования байта [] в BitmapImage. Я не уверен, нужно ли добавлять код из-за того, что изображение изначально было PNG.

Может ли кто-нибудь предоставить код для преобразования потока в BitmapImage? Благодарим за помощь.

Ответ 1

Это должно сделать это:

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

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

Замораживание растрового изображения является необязательным, но если вы его заморозите, вы можете разделить растровое изображение по потокам, что в противном случае невозможно.

Вам не нужно делать ничего особенного в отношении формата изображения - BitmapImage справится с этим.

Ответ 2

 using (var stream = new MemoryStream(data))
        {
          var bi = BitmapFrame.Create(stream , BitmapCreateOptions.IgnoreImageCache, BitmapCacheOption.OnLoad);
        }