我无法使用BitmapImage初始化WriteableBitmap

has*_*shi 9 c# silverlight

 BitmapImage img = new BitmapImage(new Uri("somepath",UriKind.Relative));
 WriteableBitmap wbm = new WriteableBitmap(img);
Run Code Online (Sandbox Code Playgroud)

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

Zab*_*sky 11

获得null引用异常的原因是BitmapImage.CreateOptions属性的默认值是BitmapCreateOptions.DelayCreation.您可以将其设置为BitmapCreateOptions.NoneWriteableBitmap在加载图像后创建:

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


Ari*_*iel 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);
Run Code Online (Sandbox Code Playgroud)

请注意,资源由应用程序类定义的静态方法GetResourceStream访问.现在,如果您将文件的构建操作更改为Content而不是Resource,则可以大大简化Uri sintax.

Uri uri = new Uri("Images/image.jpg", UriKind.Relative);
Run Code Online (Sandbox Code Playgroud)

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

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

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