преобразовать массив байтов в 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; } 

В первом примере кода stream закрывается (оставляя блок using ) до того, как изображение загружается. Вы также должны установить BitmapCacheOptions.OnLoad для достижения того, что изображение загружается немедленно, иначе stream должен быть открыт, как в вашем втором примере.

 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, если вы хотите закрыть stream после создания BitmapImage.


Кроме того, вы можете также использовать встроенное преобразование типа для преобразования из типа byte[] для ввода ImageSource (или производного BitmapSource ):

 var bitmap = (BitmapSource)new ImageSourceConverter().ConvertFrom(array); 

ImageSourceConverter называется неявно, когда вы привязываете свойство типа ImageSource (например, свойство Source ImageSource управления Image) к исходному свойству string типа Uri или byte[] .

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

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

  • Условный список itemtemplate или datatemplate в WPF
  • Имя «XYZ» не существует в пространстве имен «clr-namespace: ABC»
  • Windows 10 Universal App File / Directory Access
  • Водяной знак / текст подсказки / заполнитель TextBox
  • ObservableCollection vs. List
  • WPF VirtualizingStackPanel для повышения производительности
  • C # / WPF: отключить Text-Wrap из RichTextBox
  • WPF MVVM просматривает просмотры
  • Изменение цвета фона для выбранного элемента ListBox
  • Bind TextBox при нажатии клавиши Enter
  • Как включить виртуализацию пользовательского интерфейса в стандартном WPF ListView
  • Interesting Posts

    Определяя максимальную оперативную память, я могу обновить свой компьютер до и какого типа

    Как запустить консольное приложение .NET в фоновом режиме

    Есть ли способ предотвратить замораживание tmux, когда много текста выводится на терминал?

    Объединение двух команд sed

    загрузка файла, который поставляется в виде вложения в ответе запроса POST в PhantomJs

    Соответствующий шаблон является строгим, но для контекста элемента не найдено объявления: компонент-сканирование

    Можно ли использовать VectorDrawable в кнопках и TextViews с помощью android: DrawableRight?

    Возможно ли, что маршрутизатор «сойдет с ума» со временем?

    Загрузите ResourceDictionary из сборки

    Как установить приложение Android Market на эмулятор?

    node-websocket-server: возможно иметь несколько отдельных «трансляций» для одного процесса node.js?

    Как я могу написать общий class контейнера, который реализует данный интерфейс в C #?

    «Лямбда-выражение с телом оператора не может быть преобразовано в дерево выражений»

    Добавить «текст» в конец нескольких имен файлов

    Как отключить потоковую передачу сообщений в Lotus Notes

    Давайте будем гением компьютера.