1

我在 Silverlight 中有一张 Esri 地图,我正在尝试获取屏幕截图。但是,我面临 writeablebitmap 的跨域内容保护,说“像素不可访问”。

有没有办法可以禁用它?或silverlight 3或4中的任何其他工作?

4

4 回答 4

4

我将视频存储在具有有效 clientaccesspolicy.xml 的 Amazon Cloudfront 服务器上,以允许对 silverlight 主机 URL 进行跨域访问,并且以下功能不允许我对视频进行屏幕截图和操作像素,直到将其替换为一个 WebClient 下载代替(一个 WebClient 尊重跨域策略文件,您可以看到它在 Fiddler 中被请求,这是 MediaElement.Source 函数甚至没有尝试过的)

旧的没有工作的跨域代码

public LoadVideoFromURL(string url)
{
    var uri = new Uri(url);

    myMediaElement.Source(uri);
}

新的工作跨域代码

public LoadVideoFromURL(string url)
{
    var uri = new Uri(url);

    //Request the video
    var videoDownloader = new WebClient();

    videoDownloader.OpenReadCompleted += new OpenReadCompletedEventHandler( 
                 (s, args) => myMediaElement.SetSource(args.Result));

    videoDownloader.OpenReadAsync(uri);
}
于 2010-09-01T04:49:18.060 回答
2

您可以通过重新托管图像来解决此问题。基本上你可以在你的服务器上设置一个 wcf 服务作为地图的代理,然后当 silverlight 对你的媒体源进行安全检查时,它会看到它是由你的服务器“托管”的,那么它应该让你渲染它到一个可写位图。尽管这显然会大大增加服务器的负载。

于 2010-06-14T23:31:33.577 回答
1

解决此问题的最简单方法是确保 Silverlight 应用程序和图像托管在同一个域中。既然你问这个问题,我会假设这是不可能的。

您是否控制托管图像的服务器?如果是这样,您可以添加客户端访问策略文件以启用对 Silverlight 应用程序中图像的跨域访问。然后,您需要更改使用这些图像的方式。不要将 Image 元素的 Source 设置为图像的 URI,而是使用 WebClient 将图像下载为 Stream,并将 Image 元素的源直接设置为该 Stream。如果这样做,则在尝试访问 WriteableBitmap 像素时不会遇到跨域访问冲突。

于 2010-06-14T23:51:31.243 回答
0

如果位图的来源是另一个域,简单的答案是否定的。我不确定你是如何尝试拍摄这个“屏幕截图”的,但听起来有很好的安全理由来阻止这个......当然,当你的图像在本地域中。

鉴于您似乎想要截取用户桌面的屏幕截图,解决此问题的正确方法是让 Silverlight 应用程序需要完全信任,这在 Silverlight 3 (并在 Silverlight 4 中扩展)以来是可能的。然而,这确实要求它是一个 OOB(浏览器应用程序外),我相信。

于 2010-06-14T22:39:13.493 回答