用于快照的bitmapdata的替代方案?

时间:2011-07-04 11:35:48

标签: flash actionscript-3

我目前正在通过as3加载远程swf(使用域策略允许来自该域的所有内容 - 我自己无法更改策略文件),我想拍摄快照。问题是我加载的主要swf是从另一个没有启用允许所有策略的域加载子swf ..这使得快照功能调用“沙盒安全性”错误。我想知道是否有替代bitmapdata draw函数仍然可以拍摄“快照”而不会破坏沙箱的安全性。

提前致谢。

3 个答案:

答案 0 :(得分:2)

如果您被允许从相关域中加载数据,请执行以下操作:

  1. 使用URLLoader和URLLoaderDataFormat.BINARY将swf加载为二进制数据
  2. 使用Loader和loadBytes()
  3. 将二进制内容加载到显示对象中

    之后你应该能够draw() swf的内容。

    编辑此技术的示例。

    只需将下面的代码复制并粘贴到空白文件中,编译并将生成的swf放在http的某处(当在本地测试时,两个draw()调用都会成功,所以你不会看到差异)。

    import flash.net.URLLoader;
    import flash.net.URLLoaderDataFormat;
    import flash.net.URLRequest;
    import flash.events.Event;
    import flash.utils.ByteArray;
    import flash.display.Loader;
    import flash.display.LoaderInfo;
    import flash.system.Security;
    import flash.display.BitmapData;
    import flash.display.Bitmap;
    import flash.text.TextField;
    import flash.display.StageScaleMode;
    
    var onBinaryComplete:Function = function (event:Event) : void
    {
        trace("onBinaryComplete()");
        var loader:URLLoader = event.target as URLLoader;
        var bytes:ByteArray = loader.data as ByteArray;
        trace(bytes.length+" bytes");
        bytesLoader.loadBytes(bytes);
    }
    
    var onBytesComplete:Function = function (event:Event) : void
    {
        trace("onBytesComplete()");
        var info:LoaderInfo = event.target as LoaderInfo;
        var bmp:BitmapData = new BitmapData(300, 300, true, 0x8000FF00);
        // this will not fail, you'll see an image
        bmp.draw(info.content);
        var bitmap = new Bitmap(bmp);
        bitmap.x += 100;
        bitmap.y += 100;
        stage.addChild(bitmap); 
    }
    
    var onDirectLoadComplete:Function = function (event:Event) : void
    {
        trace("onDirectLoadComplete()");
        var bmp:BitmapData = new BitmapData(300, 300, true, 0x80FF0000);
        // this must fail, you'll get an exception
        bmp.draw(event.target.content);
        stage.addChild(new Bitmap(bmp));
    }
    
    var binaryLoader:URLLoader = new URLLoader();
    binaryLoader.dataFormat = URLLoaderDataFormat.BINARY;
    binaryLoader.addEventListener(Event.COMPLETE, onBinaryComplete);
    binaryLoader.load(new URLRequest("http://noregret.org/test/wrk.swf"));
    
    var bytesLoader:Loader = new Loader();
    bytesLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onBytesComplete);
    
    var directLoader:Loader = new Loader();
    directLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onDirectLoadComplete);
    directLoader.load(new URLRequest("http://noregret.org/test/wrk.swf"));
    

    加载数据crossdomain.xml:http://noregret.org/crossdomain.xml,但在直接加载时无法控制加载的swf内容。加载字节然后内容解决了问题。

答案 1 :(得分:1)

这几乎就是沙箱的用途。因此,您无法从您不拥有的数据创建快照。这是一个蹩脚的答案,但as the docs point out,解决它的唯一方法是使用AIR。

如果您有权访问其他域,或者您知道控制它的人,则可以在其网站上放置crossdomain.xml

答案 2 :(得分:0)

您可以通过某个代理(托管在您自己的服务器上)加载资产。许多托管公司不允许托管任何代理脚本,即使它是为应用程序加载资产。