2012-03-22 71 views

回答

0

使用BitmapDatadraw(IDrawable)函数是简单的,如果一切都在相同的SecurityDomain

只有在您尝试渲染的每个加载元素的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),它允许你利用它的位图快照)

0

简短的回答: 号但是,有一个解决办法,如果你有机会到任何服务器端技术,比如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; 
} 


?> 
+0

这将确定地解决我的问题。谢啦。 – pikar 2012-08-20 05:24:08

相关问题