【发布时间】:2012-03-22 08:34:58
【问题描述】:
有没有办法将帧捕获为 swf 的位图,加载的安全域与主应用程序不同?
【问题讨论】:
标签: actionscript-3 flash apache-flex actionscript
有没有办法将帧捕获为 swf 的位图,加载的安全域与主应用程序不同?
【问题讨论】:
标签: actionscript-3 flash apache-flex actionscript
如果所有内容都在同一个SecurityDomain 中,则使用BitmapData 的draw(IDrawable) 函数很简单。
只有当您尝试渲染的每个已加载元素的 SecurityDomain 接受发出请求的代码的域(可能是 swf 的域)时,才可能使用此技术。
查看BitmapData.draw(IDrawable) 的文档。它说它在以下情况下抛出SecurityError:
源对象和(在 Sprite 或 MovieClip 对象的情况下) 它的所有子对象都不是来自同一个域 调用者,或不在调用者可通过以下方式访问的内容中 调用了 Security.allowDomain() 方法。这个限制确实 不适用于应用程序安全沙箱中的 AIR 内容。
这样做的结果是,如果您使用标准 Loader 从您无法控制的域中加载内容,则无法创建包含该内容的任何 DisplayObjectContainer 的位图“快照”(除非它碰巧允许从所有域访问,或明确允许您的域访问)。如果您确实控制了域,则应该能够通过使用 crossdomain.xml(用于非 swf 内容)或 Security.allowDomain() 调用 swf 内容来使其工作。加载的 swf 必须调用 allowDomain。
(顺便说一句,如果您只是想从其他域(例如 JPG 或 GIF)获取包含静态图像的快照,您可以直接加载图像数据,并使用适当的 AS3 解码器将其解码为位图(而不是而不是使用标准的Loader),它允许您对其进行位图快照。)
【讨论】:
简短的回答:没有。 但是,如果您可以访问部署 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;
}
?>
【讨论】: