ImageSourceConverter抛出NullReferenceException …为什么?

在过去一小时左右的时间里,我一直在为这个问题撕掉我的头发。

我有一些代码如下:

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

当我运行我的代码时,它表示发生了NullReferenceException。 “音乐”和GetHbitmap()的返回都不为空。

我试图通过属性获取图像,因为这是我弄清楚如何访问我的Resources文件夹中的图像的唯一方法。 我只是将它们作为资源添加到app.xaml文件中,但由于某些原因我没有使用app.xaml文件。

我试错了吗? 我需要做的就是获取我的资源目录中的图像的ImageSource对象。 我可以在我的XAML中使用它们,但不能在我的生活中使用任何代码。

PS:我不能只将它们作为资源添加到XAML文件中,因为这只是一个类,所以没有XAML文件。

那么你有很多东西可以在那里无效。 我建议你将它们分开:

 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.0function吗? 我建议你尝试将这些代码提取到一个单独的项目中(你不需要显示API,只需转换图像。尝试在.NET 3.5中运行该代码。如果它以同样的方式失败,那就是从可能存在的问题列表中消除了beta-ness。

我遇到了完全相同的问题 – 我在一个漂亮的,静态类型的资源文件中得到了所有的位图,我只想用它们设置一个ImageSource。 因此,由于ImageSourceConverter抛出了空引用exception,我改变了方向并使用了这段代码:

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

希望有所帮助。

这不是.net Framework中的错误,这个空引用exception发生是因为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; } 

在使用之前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); 

尝试将coDrivr4.Properties.Resources.Music.GetHbitmap()的返回值放入temp变量中,看看它是否为null – 可能是null来自的位置。