Создавая WPF BitmapImage из MemoryStream png, gif

Я испытываю некоторые затруднения при создании a BitmapImage от a MemoryStream от png и gif байтов, полученных из веб-запроса. Байты, кажется, загружаются прекрасные и BitmapImage объект создается без проблемы однако, изображение на самом деле не представляет на моем UI. Проблема только происходит, когда загруженное изображение имеет тип png, или gif (хорошо работает для jpeg).

Вот код, который демонстрирует проблему:

var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
    Byte[] buffer = new Byte[webResponse.ContentLength];
    stream.Read(buffer, 0, buffer.Length);

    var byteStream = new System.IO.MemoryStream(buffer);

    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.DecodePixelWidth = 30;
    bi.StreamSource = byteStream;
    bi.EndInit();

    byteStream.Close();
    stream.Close();

    return bi;
}

Для тестирования этого, веб-запрос правильно получал байты, я попробовал следующее, которое сохраняет байты в файл на диске и затем загружает изображение с помощью a UriSource вместо a StreamSource и это работает на все типы изображения:

var webResponse = webRequest.GetResponse();
var stream = webResponse.GetResponseStream();
if (stream.CanRead)
{
    Byte[] buffer = new Byte[webResponse.ContentLength];
    stream.Read(buffer, 0, buffer.Length);

    string fName = "c:\\" + ((Uri)value).Segments.Last();
    System.IO.File.WriteAllBytes(fName, buffer);

    BitmapImage bi = new BitmapImage();
    bi.BeginInit();
    bi.DecodePixelWidth = 30;
    bi.UriSource = new Uri(fName);
    bi.EndInit();

    stream.Close();

    return bi;
}

Кто-либо заставил какой-либо свет сиять?

28
задан Dave Clemmer 16 September 2011 в 18:29
поделиться

2 ответа

Добавьте bi.CacheOption = BitmapCacheOption.OnLoad сразу после вашего .BeginInit () :

BitmapImage bi = new BitmapImage();
bi.BeginInit();
bi.CacheOption = BitmapCacheOption.OnLoad;
...

Без этого BitmapImage по умолчанию использует отложенную инициализацию, и к тому времени поток будет закрыт . В первом примере вы пытаетесь прочитать изображение из, возможно, закрытого или даже удаленного MemoryStream со сборщиком мусора . Во втором примере используется файл, который все еще доступен. Также не пишите

var byteStream = new System.IO.MemoryStream(buffer);

лучше

using (MemoryStream byteStream = new MemoryStream(buffer))
{
   ...
}
50
ответ дан 28 November 2019 в 02:57
поделиться

Я использую этот код:

public static BitmapImage GetBitmapImage(byte[] imageBytes)
{
   var bitmapImage = new BitmapImage();
   bitmapImage.BeginInit();
   bitmapImage.StreamSource = new MemoryStream(imageBytes);
   bitmapImage.EndInit();
   return bitmapImage;
}

Может быть, вы должны удалить эту строку:

bi.DecodePixelWidth = 30;
11
ответ дан 28 November 2019 в 02:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: