Я испытываю некоторые затруднения при создании 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;
}
Кто-либо заставил какой-либо свет сиять?
Добавьте 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))
{
...
}
Я использую этот код:
public static BitmapImage GetBitmapImage(byte[] imageBytes)
{
var bitmapImage = new BitmapImage();
bitmapImage.BeginInit();
bitmapImage.StreamSource = new MemoryStream(imageBytes);
bitmapImage.EndInit();
return bitmapImage;
}
Может быть, вы должны удалить эту строку:
bi.DecodePixelWidth = 30;