无法使用BitmapImage初始化WriteableBitmap

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

我在上面那一行遇到了运行时错误:"对象引用未设置为对象的实例"。


“path” 是文件的有效路径吗?文件的构建操作设置为“Content”还是“Resource”? - Olivier Payen
路径正确且图像已初始化。 - hashi
2个回答

11
你得到空引用异常的原因是 BitmapImage.CreateOptions属性 的默认值是 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);
   };

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

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

如果你想知道区别...如果你导航到Visual Studio项目的Bin/Debug目录,并找到包含程序的XAP文件,请将其重命名为ZIP扩展名。然后查看内部。
在两种情况下,位图显然存储在XAP文件中的某个地方。
  • 对于文件的构建操作为Resource,则它与编译的程序一起存储在DLL文件中。
  • 对于文件的构建操作为Content,则该文件存储在dll文件之外但在XAP文件内部,当你将XAP文件重命名为ZIP文件时,你可以看到它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接