Ответ 1
В первом примере кода поток закрывается (оставляя блок using
) до фактического загрузки изображения. Вы также должны установить BitmapCacheOptions.OnLoad, чтобы добиться того, что изображение будет загружено немедленно, иначе поток должен быть открыт, как во втором примере.
public BitmapImage ToImage(byte[] array)
{
using (var ms = new System.IO.MemoryStream(array))
{
var image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad; // here
image.StreamSource = ms;
image.EndInit();
return image;
}
}
В разделе "Примечания" в BitmapImage.StreamSource:
Установите свойство CacheOption в BitmapCacheOption.OnLoad, если хотите для закрытия потока после создания BitmapImage.
Кроме того, вы можете также использовать встроенное преобразование типов для преобразования из типа byte[]
в тип ImageSource
(или производный BitmapSource
):
var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array);
ImageSourceConverter называется неявно, когда вы привязываете свойство типа ImageSource
(например, свойство управления изображением Source
) к исходному свойству типа string
, Uri
или byte[]
.