ImageSourceConverter создает исключение NullReferenceException ... почему? - PullRequest
9 голосов
/ 24 июня 2009

Я рвал на себе волосы из-за этой проблемы в течение последнего часа или около того.

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

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

Когда я запускаю свой код, появляется сообщение об ошибке NullReferenceException. Ни 'Music', ни возвращение GetHbitmap () не имеют значения.

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

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

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

Ответы [ 5 ]

9 голосов
/ 04 октября 2013

Я столкнулся с точно такой же проблемой - у меня есть все мои растровые изображения в хорошем, статически типизированном файле ресурсов, и я просто хочу установить 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

Надеюсь, это поможет.

5 голосов
/ 24 июня 2009

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

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

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

РЕДАКТИРОВАТЬ: Хорошо, теперь мы точно знаем, что это происходит в ConvertFrom, я предлагаю следующий шаг - выяснить, является ли это ошибкой в ​​.NET 4.0 beta 1. Используете ли вы какие-либо функции .NET 4.0? ? Я предлагаю вам попытаться извлечь только этот бит кода в отдельный проект (вам не нужно отображать API, просто конвертируйте изображение. Попробуйте запустить этот код в .NET 3.5. Если это не удастся точно так же это исключило бета-версию из списка возможных проблем.

3 голосов
/ 05 июля 2016

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

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;
}
1 голос
/ 13 июня 2014

Перед использованием 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);
0 голосов
/ 24 июня 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...