加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

将帧从外部swf导出到Javascript

发布时间:2020-12-15 07:22:16 所属栏目:百科 来源:网络整理
导读:我试图从(任何)外部swf文件中捕获一个静止帧,通过使用我自己的flash影片作为代理加载它并将关于舞台的信息传递到 javascript.我希望尽可能保持兼容,所以我现在使用AS2 / Flash 8. 该脚本在Flash调试器中工作正常,即 trace(flash2canvasScreenshot.getPixel(w
我试图从(任何)外部swf文件中捕获一个静止帧,通过使用我自己的flash影片作为代理加载它并将关于舞台的信息传递到 javascript.我希望尽可能保持兼容,所以我现在使用AS2 / Flash 8.

该脚本在Flash调试器中工作正常,即

trace(flash2canvasScreenshot.getPixel(w,h).toString(16));

返回正确的像素颜色,其中:

ExternalInterface.call("sendToJS",flash2canvasScreenshot.getPixel(w,h).toString(16));

在已发表的电影中没有.

对于大型闪存(尺寸方面)电影,这种方法显然可能非常慢,因为它迭代每个像素.如果有人有任何更好的方法,请随意分享,但正如所说,我面临的问题是我在调试和发布方面得到了不同的结果,在发布时没有获取像素信息.

import flash.display.BitmapData;
import flash.external.*;

var myLoader:MovieClipLoader = new MovieClipLoader();
var mclListener:Object = new Object();

mclListener.onLoadInit = function(target_mc:MovieClip)
{

        var stageW = Stage.width;
        var flash2canvasScreenshot:BitmapData = new BitmapData(stageW,Stage.height,false,0x00000000);
        var pixels:Array = new Array();
        flash2canvasScreenshot.draw(element);

        for (w = 0; w <= stageW; w++)
        {
            trace(flash2canvasScreenshot.getPixel(w,h).toString(16)); // this gives correct color value for the pixels in the debugger
            ExternalInterface.call("sendToJS",h).toString(16)); // this just returns the bitmap default color,0 in this case.
            /*
            for (h = 0; h <= Stage.height; h++)
            {
                var pixel = flash2canvasScreenshot.getPixel(w,h).toString(16);
                pixels.push(pixel);
            }
            */
        }

        //ExternalInterface.call("sendToJS",pixels.toString());*/



};


myLoader.addListener(mclListener);

myLoader.loadClip("http://i.cdn.turner.com/cnn/cnnintl_adspaces/2.0/creatives/2010/6/9/21017300x250-03.swf",0);
//myLoader.loadClip("https://s.ytimg.com/yt/swfbin/watch_as3-vflJjAza6.swf",0);

//myLoader.loadClip(_level0.flash2canvasurl,_root.mc);

解决方法

您发布的代码段几乎没有问题:

>像乔伊提到的那个,但是从我的突出中脱颖而出的那个
观点是未定义的元素变量
在任何地方,所以要么是一个类型o,或者你正试图绘制一个
未定义的对象.
>您在加载完成后即刻绘制,但您加载的动画可能稍后开始.也许在加载完成后稍稍拍摄快照.
>有一段时间没有触及as2并且不记得如何处理安全问题,但是如果你是swf从另一个域加载另一个swf,那么托管你加载的swf的域也应该有一个跨域.xml策略文件允许您访问加载的swf的内容.如果您只是从另一个域加载并显示一个swf,那很好.但是,如果您尝试使用BitmapData绘制swf,那么您实际上是在尝试从该swf的内容访问像素数据,因此您需要权限.如果您无法控制跨域策略文件,则可能需要使用服务器端脚本将文件复制/代理到可以授予您加载的swf访问权限的域.

这是一个有效的代码片段的简化版本(没有外部接口/像素值部分):

var myLoader:MovieClipLoader = new MovieClipLoader();
var mclListener:Object = new Object();
mclListener.onLoadInit = function(target_mc:MovieClip)
{
    var pixels:Array = new Array();
    setTimeout(takeSnapshot,2000,target_mc);
}

myLoader.addListener(mclListener);
myLoader.loadClip("http://www.bbc.co.uk/science/humanbody/sleep/sheep/reaction_version5.swf",1);
//myLoader.loadClip("http://i.cdn.turner.com/cnn/cnnintl_adspaces/2.0/creatives/2010/6/9/21017300x250-03.swf",1);
//myLoader.loadClip("https://s.ytimg.com/yt/swfbin/watch_as3-vflJjAza6.swf",0);

function takeSnapshot(target:MovieClip):Void {
    var flash2canvasScreenshot:BitmapData = new BitmapData(150,150,0x00000000);//tiny sample
    flash2canvasScreenshot.draw(target);
    _level1._alpha = 20;//fade the loaded content
    _level0.attachBitmap(flash2canvasScreenshot,0);//show the snapshop. sorry about using _root
}

这是150×150快照的快速缩放预览:

这是一个as3代码片段,用于说明安全沙箱处理问题:

var swf:Loader = new Loader();
swf.contentLoaderInfo.addEventListener(Event.COMPLETE,loaderComplete);
swf.contentLoaderInfo.addEventListener(SecurityErrorEvent.SECURITY_ERROR,loaderSecurityError);
swf.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,loaderIOError);
swf.load(new URLRequest("http://i.cdn.turner.com/cnn/cnnintl_adspaces/2.0/creatives/2010/6/9/21017300x250-03.swf"),new LoaderContext(true));

function loaderComplete(event:Event):void{
    setTimeout(takeSWFSnapshot,2000);
}
function loaderSecurityError(event:SecurityErrorEvent):void {
    trace('caught security error',event.errorID,event.text);
}
function loaderIOError(event:IOErrorEvent):void{
    trace('caught I/O error',event.text,'tattempting to loadt',swf.contentLoaderInfo.url);
}
function takeSWFSnapshot():void{
    var clone:BitmapData = new BitmapData(swf.content.width,swf.content.height,0);
    try{
        clone.draw(swf.content);
    }catch(e:SecurityError){
        trace(e.name,e.message,e.getStackTrace());
    }
    addChild(new Bitmap(clone));
}

HTH

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读