2011-05-18 102 views
9
BitmapImage img = new BitmapImage(new Uri("somepath",UriKind.Relative)); 
WriteableBitmap wbm = new WriteableBitmap(img); 

我在上面一行中得到一个运行时错误:“对象引用未设置为对象的实例”。我无法使用BitmapImage初始化WriteableBitmap

+0

是“路径”的文件的有效路径?该文件的构建操作是否设置为“内容”或“资源”? – 2011-05-18 07:16:10

+0

路径正确,img已经初始化。 – hashi 2011-05-18 07:38:01

回答

6

如果图像文件的构建操作设置为资源,则以下代码将起作用。

Uri uri = new Uri("/ProjectName;component/Images/image.jpg", UriKind.Relative); 
StreamResourceInfo resourceInfo = Application.GetResourceStream(uri); 
BitmapImage img = new BitmapImage(); 
img.SetSource(resourceInfo.Stream); 
WriteableBitmap wbm = new WriteableBitmap(img); 

注意,资源被由应用类定义的静态方法GetResourceStream访问。 现在,如果将文件的构建操作更改为“内容”而非“资源”,则可以大大简化Uri sintax。

Uri uri = new Uri("Images/image.jpg", UriKind.Relative); 

的区别,如果你想知道... 如果您导航到Visual Studio项目的Bin/Debug目录,并找到包含你的程序的XAP文件,其重命名为ZIP扩展。并看看里面。

在这两种情况下,位图都被明显地存储在XAP文件中的某处。

  • 通过该文件的资源构建操作,它与编译的程序一起存储在DLL文件中。
  • 使用内容生成操作,文件存储在dll文件的外部,但在XAP文件中,并且当您将XAP文件重命名为ZIP文件时,您可以看到它。
+0

这解决了你的问题? – Ariel 2011-09-08 00:16:32

+0

谢谢!这解决了我的类似问题。 – 2012-12-04 12:11:44

+0

为我工作:) – JTIM 2013-11-12 07:34:49

11

您收到空引用异常的原因是BitmapImage.CreateOptions Property默认值为BitmapCreateOptions.DelayCreation。你可以将其设置为BitmapCreateOptions.None和创造WriteableBitmap后的图像加载:

BitmapImage img = new BitmapImage(new Uri("somepath",UriKind.Relative)); 
img.CreateOptions = BitmapCreateOptions.None; 
img.ImageOpened += (s, e) => 
    { 
     WriteableBitmap wbm = new WriteableBitmap((BitmapImage)s); 
    };