2013-05-18 3 views
2

Я пытаюсь создать BitmapImage из массива байтов, который возвращается службой.Создание BitmapImage из байтового массива

Мой код:

using (sc = new ServiceClient()) 
{ 
    using (MemoryStream ms = new MemoryStream(sc.GetImage())) 
    { 
     Display = new BitmapImage(); 
     Display.BeginInit(); 
     Display.StreamSource = ms; 
     Display.EndInit(); 
    } 
} 

Однако исключение в методе EndInit. Он говорит Object reference not set to an instance of an object..

Кажется, что Uri является нулевым, и это вызывает проблему. К сожалению, я не могу найти решение самостоятельно.

+0

Согласно [документации] (http://msdn.microsoft.com/en-us/library/system.windows.media.imaging.bitmapimage.streamsource.aspx), вы также присвоить значение на 'Display.UriSource'? Если это так, он будет игнорировать «StreamSource». Кроме того, у вас есть свойство 'CacheOption', установленное в' BitmapCacheOption.OnLoad'? EDIT: Кроме того, похоже, что 'Display' является членом (поле/свойство), возможно, у вас есть проблема с потоками, которая заменяет/изменяет' Display', когда вы работаете с ней? –

+0

@ChrisSinclair, я не назначаю vaule UriSource. Я просто проверил трассировку стека, и мне показалось, что из-за этого атрибута выбрано исключение нулевого указателя. Это было просто предположение. Дисплей - это свойство, которое связано с моим макетом XAML. Поэтому, в основном, я хотел бы получить изображение из службы WCF, а затем отобразить его в окне WPF. Помимо этой привязки, у меня нет кода, который может вызвать проблему с потоками. –

+0

Можете ли вы попробовать установить его свойство 'CacheOption' в' BitmapCacheOption.OnLoad'? В противном случае, насколько я понимаю, он лениво попытается получить доступ к потоку, который может быть закрыт к моменту его чтения. Согласно комментариям [здесь] (http://stackoverflow.com/a/2250851/1269654) обязательно установите его после 'BeginInit()'. EDIT: это: 'Display = new BitmapImage(); Display.BeginInit(); Display.CacheMode = BitmapCacheOption.OnLoad; Display.StreamSource = ms; Display.EndInit(); ' –

ответ

4

Ну, оказалось, что привязка WPF вызывала ошибку.

private BitmapImage _display; 
public BitmapImage Display 
{ 
    get { return _display; } 
    set 
    { 
     _display = value; 
     RaisePropertyChanged("Display"); 
    } 
} 

Я решил проблему, получив изображение не в собственности. Отображение самого себя, а скорее в файле _display. Итак, работает нормально.

using (sc = new ServiceClient()) 
{ 
    using (MemoryStream ms = new MemoryStream(sc.GetImage())) 
    { 
     _display = new BitmapImage(); 
     _display.BeginInit(); 
     _display.CacheOption = BitmapCacheOption.OnLoad; 
     _display.StreamSource = ms; 
     _display.EndInit(); 
    } 
} 

Display = _display; 
1

u назначает memory stream непосредственно на , что вызывает error. Сначала вам нужно получить array от bytes &, а не convert в memory stream, а затем назначить bitmap source, вот и все !!!

using (sc = new ServiceClient()) 
    { 
      Byte[] array = sc.GetImage(); 

      Display = new BitmapImage(); 
      Display.BeginInit(); 
      Display.StreamSource = new MemoryStream(array); 
      Display.EndInit(); 
    } 
+1

Я не знал, что вы можете «использовать» на 'byte []'; Я думал, что это '_must_ быть' IDisposable'. EDIT: Быстрый тест, я не думаю, что вы можете. Как этот код (при условии, что вы его исправите) не отличается от того, что поставляется? Он просто избегает утилизации потока? –

+0

ответ был обновлен. –

+0

Описание в вашем обновленном ответе _exactly_, что делает Дмитрий. Разница между вашим ответом и его оригинальным кодом заключается в том, что ваш ответ не удаляет поток памяти. –

 Смежные вопросы

  • Нет связанных вопросов^_^