守望者--AIR技术交流

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
热搜: ANE FlasCC 炼金术
查看: 698|回复: 0

[ActionScript] 影片剪辑处理器

[复制链接]
  • TA的每日心情
    擦汗
    2018-4-10 15:18
  • 签到天数: 447 天

    [LV.9]以坛为家II

    1742

    主题

    2094

    帖子

    13万

    积分

    超级版主

    Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

    威望
    562
    贡献
    29
    金币
    51756
    钢镚
    1422

    开源英雄守望者

    发表于 2015-1-24 20:33:11 | 显示全部楼层 |阅读模式
    1. package com.utils
    2. {
    3.         import com.encoders.utils.CanvasEncoder;
    4.         import com.type.McFrameType;
    5.         import com.utils.data.HashMap;
    6.         import com.utils.pack.BitmapDataPacker;
    7.         import com.view.LogWin;
    8.        
    9.         import flash.display.BitmapData;
    10.         import flash.display.DisplayObjectContainer;
    11.         import flash.display.MovieClip;
    12.         import flash.geom.ColorTransform;
    13.         import flash.geom.Matrix;
    14.         import flash.geom.Point;
    15.         import flash.geom.Rectangle;
    16.         import flash.utils.ByteArray;
    17.         import flash.utils.Dictionary;

    18.         /**
    19.          * 影片剪辑处理器
    20.          * @author Adiers
    21.          */
    22.         public class MovieHandler
    23.         {
    24.                 /**
    25.                  * 分析
    26.                  * @param movie:MovieClip        影片剪辑
    27.                  * @return 影片播放信息
    28.                  */
    29.                 public static function parseMc(movie:MovieClip):HashMap
    30.                 {
    31.                         var infoMap:HashMap = new HashMap();
    32.                        
    33.                         var totalFrames:int = movie.totalFrames;
    34.                         var childPlayDic:Dictionary = new Dictionary();
    35.                        
    36.                         var drawMtx:Matrix = new Matrix();
    37.                         var effectRect:Rectangle;
    38.                         var cutRect:Rectangle;
    39.                        
    40.                         var perBmd:BitmapData;
    41.                         var nowBmd:BitmapData;
    42.                         var tpbd:BitmapData;
    43.                         var cutBmd:BitmapData;
    44.                        
    45.                         for(var frame:int = 1; frame <= totalFrames; frame++)
    46.                         {
    47.                                 movie.gotoAndStop(frame);
    48.                                
    49.                                 for each(var playData:Array in childPlayDic)
    50.                                 {
    51.                                         playData[0] = false;
    52.                                 }
    53.                                 playChilds(movie as DisplayObjectContainer, childPlayDic);
    54.                                
    55.                                 effectRect = movie.getBounds(null);
    56.                                 if(effectRect.isEmpty())
    57.                                 {
    58.                                         LogWin.showLog("第" + frame + "帧是空白关键帧");
    59.                                         infoMap.put(frame, {"type":McFrameType.EMPTY});
    60.                                         continue;
    61.                                 }
    62.                                
    63.                                 drawMtx.tx = -effectRect.x;
    64.                                 drawMtx.ty = -effectRect.y;
    65.                                 nowBmd = new BitmapData(effectRect.width, effectRect.height, true, 0x00ffffff);
    66.                                 nowBmd.draw(movie, drawMtx, null, null, null, false);
    67.                                 drawMtx.identity();
    68.                                
    69.                                 tpbd = perBmd;
    70.                                 perBmd = nowBmd.clone();
    71.                                 if(isCopy(tpbd, nowBmd))
    72.                                 {
    73.                                         LogWin.showLog("第" + frame + "帧是复刻帧");
    74.                                         infoMap.put(frame, {"type":McFrameType.COPY});
    75.                                         continue;
    76.                                 }
    77.                                
    78.                                 cutRect = nowBmd.getColorBoundsRect(0xFF000000, 0x00000000, false);
    79.                                 LogWin.showLog("原始矩形:" + effectRect + "\n截取矩形:" + cutRect);
    80.                                
    81.                                 if(cutRect.isEmpty())
    82.                                 {
    83.                                         LogWin.showLog("第" + frame + "帧是空白关键帧");
    84.                                         infoMap.put(frame, {"type":McFrameType.EMPTY});
    85.                                         continue;       
    86.                                 }
    87.                                
    88.                                 cutBmd = new BitmapData(cutRect.width, cutRect.height, true, 0x00ffffff);
    89.                                 cutBmd.copyPixels(nowBmd, cutRect, new Point(0, 0), null, null, false);
    90.                                 nowBmd.dispose();
    91.                                
    92.                                 LogWin.showLog("第" + frame + "帧是关键帧");
    93.                                 infoMap.put(frame, {"type":McFrameType.KEY, "bitmapData":cutBmd, "offsetX":effectRect.x + cutRect.x, "offsetY":effectRect.y + cutRect.y});
    94.                         }
    95.                         return infoMap;
    96.                 }

    97.                 /**
    98.                  * 编码影片文件
    99.                  * @param fileBytes:ByteArray        数据载体
    100.                  * @param mcInfo:HashMap                影片剪辑分析信息
    101.                  * @param packBmd:Boolean        是否打包位图图片
    102.                  */
    103.                 public static function encodeMc(fileBytes:ByteArray, mcInfo:HashMap, packBmd:Boolean = false):void
    104.                 {
    105.                         if(packBmd)
    106.                         {
    107.                                 encodeMc_PackBmd(fileBytes, mcInfo);
    108.                         }
    109.                         else
    110.                         {
    111.                                 encodeMc_DisperseBmd(fileBytes, mcInfo);
    112.                         }
    113.                 }
    114.                
    115.                 /**
    116.                  * 编码影片剪辑数据--打包位图的方式
    117.                  * @param fileBytes:ByteArray        数据载体
    118.                  * @param mcInfo:HashMap                影片剪辑分析信息
    119.                  */
    120.                 private static function encodeMc_PackBmd(fileBytes:ByteArray, mcInfo:HashMap):void
    121.                 {
    122.                         fileBytes.writeBoolean(true);
    123.                        
    124.                         var bmdList:Vector.<BitmapData> = getBitmapDatas(mcInfo);
    125.                         var packInfo:Object = BitmapDataPacker.pack(bmdList);
    126.                        
    127.                         var canvasBytes:ByteArray = CanvasEncoder.encode(packInfo["canvas"]);
    128.                         fileBytes.writeBytes(canvasBytes);//写入画布数据

    129.                         var frames:Array = mcInfo.keys();
    130.                         frames.sort(Array.NUMERIC);
    131.                         var frame:int;
    132.                         var frameInfo:Object;
    133.                         var frameType:int;
    134.                         var frameLen:int = frames.length;
    135.                        
    136.                         var packRects:Vector.<Rectangle> = packInfo["rects"];
    137.                         var packRect:Rectangle;
    138.                        
    139.                         for(var i:int = 0; i < frameLen; i++)
    140.                         {
    141.                                 frame = frames[i];
    142.                                 frameInfo = mcInfo.getValue(frame);
    143.                                 frameType = frameInfo["type"];
    144.                                 fileBytes.writeByte(frameType);//写入帧类型
    145.                                
    146.                                 if(frameType == McFrameType.KEY)
    147.                                 {
    148.                                         fileBytes.writeShort(frameInfo["offsetX"]);//写入X偏移量
    149.                                         fileBytes.writeShort(frameInfo["offsetY"]);//写入Y偏移量
    150.                                        
    151.                                         packRect = packRects.shift();
    152.                                         fileBytes.writeShort(packRect.x);
    153.                                         fileBytes.writeShort(packRect.y);
    154.                                         fileBytes.writeShort(packRect.width);
    155.                                         fileBytes.writeShort(packRect.height);
    156.                                 }
    157.                         }
    158.                 }
    159.                
    160.                 /**
    161.                  * 编码影片剪辑数据--分散位图的方式
    162.                  * @param fileBytes:ByteArray        数据载体
    163.                  * @param mcInfo:HashMap                影片剪辑分析信息
    164.                  */
    165.                 private static function encodeMc_DisperseBmd(fileBytes:ByteArray, mcInfo:HashMap):void
    166.                 {
    167.                         fileBytes.writeBoolean(false);
    168.                        
    169.                         var frames:Array = mcInfo.keys();
    170.                         frames.sort(Array.NUMERIC);
    171.                         var frame:int;
    172.                         var frameInfo:Object;
    173.                         var frameType:int;
    174.                         var frameLen:int = frames.length;
    175.                         var canvasBytes:ByteArray;
    176.                         for(var i:int = 0; i < frameLen; i++)
    177.                         {
    178.                                 frame = frames[i];
    179.                                 frameInfo = mcInfo.getValue(frame);
    180.                                 frameType = frameInfo["type"];
    181.                                 fileBytes.writeByte(frameType);//写入帧类型
    182.                                
    183.                                 if(frameType == McFrameType.KEY)
    184.                                 {
    185.                                         fileBytes.writeShort(frameInfo["offsetX"]);//写入X偏移量
    186.                                         fileBytes.writeShort(frameInfo["offsetY"]);//写入Y偏移量
    187.                                        
    188.                                         canvasBytes = CanvasEncoder.encode(frameInfo["bitmapData"]);
    189.                                         fileBytes.writeBytes(canvasBytes);
    190.                                 }
    191.                         }
    192.                 }
    193.                
    194.                 /**
    195.                  * 判断两个colorTransform是否一致
    196.                  * @param colorTransform1:ColorTransform         对比1
    197.                  * @param colorTransform2:ColorTransform        对比2
    198.                  */
    199.                 public static function compareColorTransform(colorTransform1:ColorTransform, colorTransform2:ColorTransform):Boolean
    200.                 {
    201.                         if(colorTransform1.alphaMultiplier != colorTransform2.alphaMultiplier)
    202.                         {
    203.                                 return false;
    204.                         }
    205.                         if(colorTransform1.redMultiplier != colorTransform2.redMultiplier)
    206.                         {
    207.                                 return false;
    208.                         }
    209.                         if(colorTransform1.greenMultiplier != colorTransform2.greenMultiplier)
    210.                         {
    211.                                 return false;
    212.                         }
    213.                         if(colorTransform1.blueMultiplier != colorTransform2.blueMultiplier)
    214.                         {
    215.                                 return false;
    216.                         }
    217.                         if(colorTransform1.alphaOffset != colorTransform2.alphaOffset)
    218.                         {
    219.                                 return false;
    220.                         }
    221.                         if(colorTransform1.redOffset != colorTransform2.redOffset)
    222.                         {
    223.                                 return false;
    224.                         }
    225.                         if(colorTransform1.greenOffset != colorTransform2.greenOffset)
    226.                         {
    227.                                 return false;
    228.                         }
    229.                         if(colorTransform1.blueOffset != colorTransform2.blueOffset)
    230.                         {
    231.                                 return false;
    232.                         }
    233.                         return true;
    234.                 }
    235.                
    236.                 /**
    237.                  * 播放子级
    238.                  */
    239.                 private static function playChilds(container:DisplayObjectContainer, childPlayDic:Dictionary):void
    240.                 {
    241.                         if(!container)
    242.                         {
    243.                                 return;
    244.                         }
    245.                         for(var i:int = 0; i < container.numChildren; i++)
    246.                         {
    247.                                 playMc(container.getChildAt(i) as MovieClip, childPlayDic);
    248.                         }
    249.                 }
    250.                
    251.                 /**
    252.                  * 播放影片
    253.                  */
    254.                 private static function playMc(mc:MovieClip, childPlayDic:Dictionary):void
    255.                 {
    256.                         if(!mc)
    257.                         {
    258.                                 return;
    259.                         }
    260.                        
    261.                         var playData:Array;
    262.                         if(mc in childPlayDic)
    263.                         {
    264.                                 playData = childPlayDic[mc];
    265.                         }
    266.                         else
    267.                         {
    268.                                 playData = [false, 1];
    269.                                 childPlayDic[mc] = playData;
    270.                         }
    271.                        
    272.                         var played:Boolean = playData[0];
    273.                         if(!played)
    274.                         {
    275.                                 var frame:int = playData[1] + 1;
    276.                                 mc.gotoAndStop(frame);
    277.                                 playData[0] = true;
    278.                                 playData[1] = frame;
    279.                         }
    280.                        
    281.                         playChilds(mc, childPlayDic);
    282.                 }
    283.                
    284.                 /**
    285.                  * 判断是否是复刻帧
    286.                  * @param preBmd:BitmapData                前一帧的位图数据
    287.                  * @param nowBmd:BitmapData                当前帧的位图数据
    288.                  */
    289.                 private static function isCopy(preBmd:BitmapData, nowBmd:BitmapData):Boolean
    290.                 {
    291.                         if(!preBmd)
    292.                         {
    293.                                 return false;
    294.                         }
    295.                         return nowBmd.compare(preBmd) == 0;
    296.                 }
    297.                
    298.                 /**
    299.                  * 从影片信息中获取位图数据
    300.                  */
    301.                 private static function getBitmapDatas(mcInfo:HashMap):Vector.<BitmapData>
    302.                 {
    303.                         var bmdList:Vector.<BitmapData> = new Vector.<BitmapData>();
    304.                         var frames:Array = getKeyFrames(mcInfo);
    305.                         var len:int = frames.length;
    306.                         if(len > 0)
    307.                         {
    308.                                 var bmd:BitmapData;
    309.                                 var frame:int;
    310.                                 var info:Object;
    311.                                 for(var i:int = 0; i < len; i++)
    312.                                 {
    313.                                         frame = frames[i];
    314.                                         info = mcInfo.getValue(frame);
    315.                                         bmd = info["bitmapData"];
    316.                                         bmdList.push(bmd);
    317.                                 }
    318.                         }
    319.                         else
    320.                         {
    321.                                 LogWin.showLog("位图数据为空!");
    322.                         }
    323.                         return bmdList;
    324.                 }
    325.                
    326.                 /**
    327.                  * 从影片信息中获取关键帧列表
    328.                  */
    329.                 private static function getKeyFrames(mcInfo:HashMap):Array
    330.                 {
    331.                         var frames:Array = [];
    332.                         mcInfo.eachKey(function(frame:int):void{
    333.                                 var info:Object = mcInfo.getValue(frame);
    334.                                 if(info["bitmapData"])
    335.                                 {
    336.                                         frames.push(frame);
    337.                                 }
    338.                         });
    339.                         frames.sort(Array.NUMERIC);
    340.                         return frames;
    341.                 }
    342.         }
    343. }
    复制代码


    守望者AIR技术交流社区(www.airmyth.com)
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    
    关闭

    站长推荐上一条 /4 下一条

    QQ|手机版|Archiver|网站地图|小黑屋|守望者 ( 京ICP备14061876号

    GMT+8, 2019-10-22 06:19 , Processed in 0.046526 second(s), 35 queries .

    守望者AIR

    守望者AIR技术交流社区

    本站成立于 2014年12月31日

    快速回复 返回顶部 返回列表