2010-08-03 44 views
2

如果有人可以给我一个关于如何使用它的例子,一个流? (不知道如何工作的)我知道如何创建一个URI现在我需要这个图像转换成WriteableBitmap一个BitmapImage,但我得到一个空异常错误像这样的东西:WriteableBitmap在Silverlight 4中有新功能吗?

BitmapImage image = new BitmapImage(new Uri("http://www.example.com/example.png")); 
WriteableBitmap newImage = new WriteableBitmap(image); 
+0

要从Web文件或资源流中填充WriteableBitmap和PNG图像吗? – 2010-08-04 07:36:30

+0

我在我想用来填充WriteableBitmap的网页上有一个PNG,我不在乎如何。但是我需要修改图像(在像素级别,PNG的8位会使它更容易)使用资源流更好吗? – david 2010-08-04 13:56:42

+0

我刚编辑答案。 – 2010-08-05 08:46:08

回答

4

简而言之:不,在Silverlight 4中没有新功能。WriteableBitmapEx试图弥补缺失的功能。

关于您的实际问题: 您应该为BitmapImage.ImageFailed事件添加处理程序,以查看是否在下载图像时发生错误。你应该在ImageOpened事件处理程序中创建WriteableBitmap。

var image = new BitmapImage(new Uri("http://www.example.com/example.png")); 
WriteableBitmap newImage = null; 
image.ImageOpened += (s, e) => newImage = new WriteableBitmap(image); 

请注意,跨域引用是允许的。有关详细信息,请参见MSDN page您应该将图像放入Web Project的ClientBin文件夹中,并使用相对路径。

作为一种替代方法,您也可以将图像编译为资源并从中加载它。 WriteableBitmapEx有一个扩展方法来使这个任务变得更容易一些。但请记住,这会使组件规模增大,并且初始XAP加载时间将增加。

// Load an image from the calling Assembly's resources only by passing the relative path 
var writeableBmp = new WriteableBitmap(0, 0).FromResource("example.png"); 
+0

我试过你的想法,现在我没有收到错误,但是我也没有得到一个图像..这意味着服务器不允许跨域请求?因此我无法做到这一点? – david 2010-08-04 13:54:09

+0

查看跨域调用的这两个链接: http://weblogs.asp.net/jgalloway/archive/2008/12/12/silverlight-crossdomain-access-workarounds.aspx http://blogs.msdn.com /b/silverlightws/archive/2008/03/30/some-tips-on-cross-domain-calls.aspx – 2010-08-05 08:37:49

+0

两者都不适合我。第一个代码块永远不会调用ImageOpened处理程序;第二个抛出异常。我正在使用Silverlight 5。 – 2012-12-27 07:44:54