2009-06-24 1 views
8

Я вырываю волосы за эту проблему в течение последнего часа или около того.ImageSourceConverter выбрасывает исключение NullReference ... почему?

У меня есть некоторый код, который идет как это:

videoTile.Icon = new ImageSourceConverter().ConvertFrom(coDrivr4.Properties.Resources.Music.GetHbitmap()) as ImageSource; 

Когда я запускаю мой код, он говорит, что произошло NullReferenceException. Ни «Музыка», ни возврат GetHbitmap() не равны нулю.

Я пытаюсь получить изображение через Свойства, потому что это единственный способ, которым я выяснил, как получить доступ к изображениям в папке «Мои ресурсы». Я просто добавлю их в файл app.xaml в качестве ресурса, но я не использую файл app.xaml по нескольким причинам.

Я пытаюсь сделать это неправильно? Все, что мне нужно сделать, это получить объект ImageSource изображения, который у меня есть в каталоге ресурсов. Я могу использовать их очень хорошо в своем XAML, но не могу, чтобы жизнь меня делала это в любом коде.

P.S .: Я не могу просто добавить их в качестве ресурса в файл XAML, потому что это всего лишь класс и поэтому нет файла XAML.

+0

В полной стеке исключений должна быть какая-то дополнительная информация – moogs

+0

Вы могли бы подумать, что буквально ничего нет. Это то, что выходит из «Копировать описание исключения в буфер обмена»: Исключено System.NullReferenceException Message = Ссылка на объект не установлена ​​в экземпляр объекта. Источник = PresentationCore StackTrace: в System.Windows.Media.ImageSourceConverter.ConvertFrom (ITypeDescriptorContext контексте, CultureInfo культуры, значение объекта) в System.ComponentModel.TypeConverter.ConvertFrom (значение объекта) на coDrivr4.Conductor.PopulateDefaultApplicationTiles() в ... InnerException: –

+0

Я также должен указать, что я запускаю VS2010 и .NET 4.0. Не очень уверенно, если это имеет большое значение, но эй, это бета-версия. –

ответ

5

У вас есть много вещей, которые может быть там, где нет. Я предлагаю вам разделить их:

Bitmap bitmap = coDrivr4.Properties.Resources.Music; 
object source = new ImageSourceConverter().ConvertFrom(bitmap.GetHbitmap()); 
ImageSource imageSource = (ImageSource) source; 
videoTile.Icon = imageSource; 

Обратите внимание на использовании гипса, а не as оператора здесь. Если sourceне a ImageSource, это вызовет InvalidCastException, который будет более наглядным, чем просто заканчивается как нулевая ссылка.

EDIT: Итак, теперь мы точно знаем, что это происходит в ConvertFrom. Предлагаю следующий шаг - выяснить, является ли это ошибкой в ​​.NET 4.0 beta 1. На самом деле вы используете какие-либо возможности .NET 4.0? Я предлагаю вам попытаться извлечь именно этот бит кода в отдельный проект (вам не нужно отображать API, просто конвертируйте изображение. Попробуйте запустить этот код в .NET 3.5. Если он не сработает таким же образом , это устраняет бета-версию из списка возможных проблем.

+0

Это не он. Такая же ошибка возникает в строке «object source = ...». –

+0

Правильно, но важно то, что мы установили, что это определенно в ConvertFrom. По общему признанию, мы бы увидели это сразу из трассировки стека ... –

+0

Итак, что же это за следующий шаг? У меня нет идей для тестирования того, что происходит в этот момент. –

0

Попробуйте поместить возвращаемое значение coDrivr4.Properties.Resources.Music.GetHbitmap() во временную переменную и посмотреть, является ли оно нулевым - это может быть тот случай, откуда исходит нуль.

+0

Это определенно не является нулевым, как отладчик, так и мой быстрый тест в коде. –

8

Я столкнулся с той же проблемой - у меня есть все мои растровые изображения в хорошем статически типизированном файле ресурсов, и я просто хочу установить с ними ImageSource . Таким образом, так как ImageSourceConverter кидал пустую ссылку исключения, я изменил курс и использовал этот кусок кода вместо:.

Bitmap bitmap = entityCol.EntityCollectionImage; 
this.Image = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(bitmap.GetHbitmap(), IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions()); // Image is an image source 

Надежда, что помогает

+1

Это работает безупречно. Метод ConvertFrom по-прежнему вызывает исключение NullReferenceException, даже если объект, который я передаю, не является нулевым (я дважды проверял с помощью отладчика Visual Studio). – MrAsterisco

1

Перед использованием ConvertFrom сохранить ваш растровый в MemoryStream

Bitmap canvas = new Bitmap(secScreen.Bounds.Width, secScreen.Bounds.Height); 
Graphics g = Graphics.FromImage(canvas); 
g.Clear(System.Drawing.Color.Yellow); 

MemoryStream stream = new MemoryStream(); 
canvas.Save(stream, System.Drawing.Imaging.ImageFormat.Png); 
ImageSource isrg = (ImageSource)new ImageSourceConverter().ConvertFrom(stream); 
1

Это не ошибка в .NET Framework, это пустая ссылка исключение возникает, поскольку ImageSourceConverter не может преобразовать объект типа Bitmap, он может конвертировать: поток, строка, Ури, байт [], так что вы должны изменить свой код, чтобы что-то вроде этого:

var imageSourceConverter = new ImageSourceConverter(); 
byte[] tempBitmap = BitmapToByte(eventArgs.Frame); 
ImageSource image = (ImageSource)imageSourceConverter.ConvertFrom(tempBitmap); 

...

private byte[] BitmapToByte(Bitmap bitmap) 
{ 
    byte[] byteArray; 
    using (MemoryStream stream = new MemoryStream()) 
    { 
     bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Bmp); 
     stream.Close(); 

     byteArray = stream.ToArray(); 
    } 
    return byteArray; 
}