有没有办法捕获帧作为swf的位图加载与主应用程序不同的安全域?
发布于 2012-03-23 05:56:23
如果所有内容都在同一个SecurityDomain中,那么使用BitmapData的draw(IDrawable)函数就很简单。
只有当您试图呈现到的每个已加载元素的SecurityDomain接受发出请求的代码域(可能是swf域)时,才可以使用此技术。
查看BitmapData.draw(IDrawable)的文档。它说在以下情况下会抛出SecurityError:
Sprite源对象及其所有子对象(如果是
或MovieClip对象)并不与调用方来自相同的域,或者不在调用方可以通过调用Security.allowDomain()方法访问的内容中。此限制不适用于应用程序安全沙箱中的AIR内容。
这样做的结果是,如果您使用标准Loader从不受控制的域加载内容,则无法创建包含该内容的任何DisplayObjectContainer的位图“快照”(除非恰好允许从所有域或您的域显式访问)。如果您确实控制了域,您应该能够通过对swf内容使用crossdomain.xml (对于非swf内容)或Security.allowDomain()调用来使其工作。加载的swf必须进行allowDomain调用。
(顺便说一句,如果您只是尝试获取快照,包括来自其他域的静态图像,例如JPG或GIF,则可以直接加载图像数据,并使用适当的AS3解码器(而不是使用标准Loader)将其解码为位图,从而允许您拍摄位图快照。)
发布于 2012-03-23 07:50:28
简短的回答是:不。但是,如果您可以访问任何服务器端技术,例如在部署swf时使用PHP,则有一个变通方法。修复方法是使用PHP为您代理图像。PHP脚本使用cUrl加载图像,yuor swf能够加载它们,因为它们来自相同的域。
下面是一个简单的代理脚本示例。在生产环境中,您应该加强脚本以防止未经授权的用户访问它。
<?php
$post_data = $HTTP_RAW_POST_DATA;
$header[] = "Content-type: text/xml";
$header[] = "Content-length: ".strlen($post_data);
$ch = curl_init( $_GET['path'] );
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
if ( strlen($post_data)>0 ){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
}
$response = curl_exec($ch);
$response_headers = curl_getinfo($ch);
if (curl_errno($ch)) {
print curl_error($ch);
} else {
print_r(curl_getinfo($ch));
curl_close($ch);
header( 'Content-type: ' . $response_headers['content-type']);
print $response;
}
?>https://stackoverflow.com/questions/9818752
复制相似问题