Подтвердить что ты не робот

Преобразовать массив байтов в bitmapimage

Я собираюсь преобразовать массив байтов в System.Windows.Media.Imaging.BitmapImage и показать BitmapImage в элементе управления изображением.

Когда я использую первый код, замечание происходит! нет ошибки, и изображение не отображается. Но когда я использую второй, он отлично работает! может ли кто-нибудь сказать, что происходит?

первый код находится здесь:

public BitmapImage ToImage(byte[] array)
{
   using (System.IO.MemoryStream ms = new System.IO.MemoryStream(array))
   {
       BitmapImage image = new BitmapImage();
       image.BeginInit();
       image.StreamSource = ms;
       image.EndInit();
       return image;
   }
}

второй код находится здесь:

public BitmapImage ToImage(byte[] array)
{
   BitmapImage image = new BitmapImage();
   image.BeginInit();
   image.StreamSource = new System.IO.MemoryStream(array);
   image.EndInit();
   return image;
 }
4b9b3361

Ответ 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[].

Ответ 2

В первом случае вы определили свой MemoryStream в блоке using, что заставляет объект удаляться, когда вы выходите из блока. Таким образом, вы возвращаете BitmapImage с диспозицией (и несуществующим) потоком.

MemoryStream не сохраняйте неуправляемые ресурсы, поэтому вы можете оставить память и позволить GC обрабатывать процесс освобождения (но это не очень хорошая практика).