我无法使用BitmapImage初始化WriteableBitmap

时间:2011-05-18 06:10:10

标签: c# silverlight

 BitmapImage img = new BitmapImage(new Uri("somepath",UriKind.Relative));
 WriteableBitmap wbm = new WriteableBitmap(img);

我在上面的行中收到运行时错误:“对象引用未设置为对象的实例。”

2 个答案:

答案 0 :(得分: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);
   };

答案 1 :(得分:6)

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

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访问的。 现在,如果您将文件的构建操作更改为Content而不是Resource,则可以大大简化Uri sintax。

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

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

在这两种情况下,位图都显然存储在XAP文件中的某个位置。

  • 使用文件的Build Action of Resource,它与编译的程序一起存储在DLL文件中。
  • 使用内容的构建操作,文件存储在dll文件的外部,但存储在XAP文件中,当您将XAP文件重命名为ZIP文件时,您可以看到它。