- 积分
- 136119
- 注册时间
- 2014-12-27
- 最后登录
- 2024-3-28
- 在线时间
- 602 小时
- 威望
- 562
- 贡献
- 29
- 金币
- 52623
- 钢镚
- 1422
- 交易凭证
- 1
- 分享
- 0
- 精华
- 33
- 帖子
- 2094
- 主题
- 1742
TA的每日心情 | 擦汗 2018-4-10 15:18 |
---|
签到天数: 447 天 [LV.9]以坛为家II
超级版主
- 威望
- 562
- 贡献
- 29
- 金币
- 52623
- 钢镚
- 1422
|
- package com.utils
- {
- import com.encoders.utils.CanvasEncoder;
- import com.type.McFrameType;
- import com.utils.data.HashMap;
- import com.utils.pack.BitmapDataPacker;
- import com.view.LogWin;
-
- import flash.display.BitmapData;
- import flash.display.DisplayObjectContainer;
- import flash.display.MovieClip;
- import flash.geom.ColorTransform;
- import flash.geom.Matrix;
- import flash.geom.Point;
- import flash.geom.Rectangle;
- import flash.utils.ByteArray;
- import flash.utils.Dictionary;
- /**
- * 影片剪辑处理器
- * @author Adiers
- */
- public class MovieHandler
- {
- /**
- * 分析
- * @param movie:MovieClip 影片剪辑
- * @return 影片播放信息
- */
- public static function parseMc(movie:MovieClip):HashMap
- {
- var infoMap:HashMap = new HashMap();
-
- var totalFrames:int = movie.totalFrames;
- var childPlayDic:Dictionary = new Dictionary();
-
- var drawMtx:Matrix = new Matrix();
- var effectRect:Rectangle;
- var cutRect:Rectangle;
-
- var perBmd:BitmapData;
- var nowBmd:BitmapData;
- var tpbd:BitmapData;
- var cutBmd:BitmapData;
-
- for(var frame:int = 1; frame <= totalFrames; frame++)
- {
- movie.gotoAndStop(frame);
-
- for each(var playData:Array in childPlayDic)
- {
- playData[0] = false;
- }
- playChilds(movie as DisplayObjectContainer, childPlayDic);
-
- effectRect = movie.getBounds(null);
- if(effectRect.isEmpty())
- {
- LogWin.showLog("第" + frame + "帧是空白关键帧");
- infoMap.put(frame, {"type":McFrameType.EMPTY});
- continue;
- }
-
- drawMtx.tx = -effectRect.x;
- drawMtx.ty = -effectRect.y;
- nowBmd = new BitmapData(effectRect.width, effectRect.height, true, 0x00ffffff);
- nowBmd.draw(movie, drawMtx, null, null, null, false);
- drawMtx.identity();
-
- tpbd = perBmd;
- perBmd = nowBmd.clone();
- if(isCopy(tpbd, nowBmd))
- {
- LogWin.showLog("第" + frame + "帧是复刻帧");
- infoMap.put(frame, {"type":McFrameType.COPY});
- continue;
- }
-
- cutRect = nowBmd.getColorBoundsRect(0xFF000000, 0x00000000, false);
- LogWin.showLog("原始矩形:" + effectRect + "\n截取矩形:" + cutRect);
-
- if(cutRect.isEmpty())
- {
- LogWin.showLog("第" + frame + "帧是空白关键帧");
- infoMap.put(frame, {"type":McFrameType.EMPTY});
- continue;
- }
-
- cutBmd = new BitmapData(cutRect.width, cutRect.height, true, 0x00ffffff);
- cutBmd.copyPixels(nowBmd, cutRect, new Point(0, 0), null, null, false);
- nowBmd.dispose();
-
- LogWin.showLog("第" + frame + "帧是关键帧");
- infoMap.put(frame, {"type":McFrameType.KEY, "bitmapData":cutBmd, "offsetX":effectRect.x + cutRect.x, "offsetY":effectRect.y + cutRect.y});
- }
- return infoMap;
- }
- /**
- * 编码影片文件
- * @param fileBytes:ByteArray 数据载体
- * @param mcInfo:HashMap 影片剪辑分析信息
- * @param packBmd:Boolean 是否打包位图图片
- */
- public static function encodeMc(fileBytes:ByteArray, mcInfo:HashMap, packBmd:Boolean = false):void
- {
- if(packBmd)
- {
- encodeMc_PackBmd(fileBytes, mcInfo);
- }
- else
- {
- encodeMc_DisperseBmd(fileBytes, mcInfo);
- }
- }
-
- /**
- * 编码影片剪辑数据--打包位图的方式
- * @param fileBytes:ByteArray 数据载体
- * @param mcInfo:HashMap 影片剪辑分析信息
- */
- private static function encodeMc_PackBmd(fileBytes:ByteArray, mcInfo:HashMap):void
- {
- fileBytes.writeBoolean(true);
-
- var bmdList:Vector.<BitmapData> = getBitmapDatas(mcInfo);
- var packInfo:Object = BitmapDataPacker.pack(bmdList);
-
- var canvasBytes:ByteArray = CanvasEncoder.encode(packInfo["canvas"]);
- fileBytes.writeBytes(canvasBytes);//写入画布数据
- var frames:Array = mcInfo.keys();
- frames.sort(Array.NUMERIC);
- var frame:int;
- var frameInfo:Object;
- var frameType:int;
- var frameLen:int = frames.length;
-
- var packRects:Vector.<Rectangle> = packInfo["rects"];
- var packRect:Rectangle;
-
- for(var i:int = 0; i < frameLen; i++)
- {
- frame = frames[i];
- frameInfo = mcInfo.getValue(frame);
- frameType = frameInfo["type"];
- fileBytes.writeByte(frameType);//写入帧类型
-
- if(frameType == McFrameType.KEY)
- {
- fileBytes.writeShort(frameInfo["offsetX"]);//写入X偏移量
- fileBytes.writeShort(frameInfo["offsetY"]);//写入Y偏移量
-
- packRect = packRects.shift();
- fileBytes.writeShort(packRect.x);
- fileBytes.writeShort(packRect.y);
- fileBytes.writeShort(packRect.width);
- fileBytes.writeShort(packRect.height);
- }
- }
- }
-
- /**
- * 编码影片剪辑数据--分散位图的方式
- * @param fileBytes:ByteArray 数据载体
- * @param mcInfo:HashMap 影片剪辑分析信息
- */
- private static function encodeMc_DisperseBmd(fileBytes:ByteArray, mcInfo:HashMap):void
- {
- fileBytes.writeBoolean(false);
-
- var frames:Array = mcInfo.keys();
- frames.sort(Array.NUMERIC);
- var frame:int;
- var frameInfo:Object;
- var frameType:int;
- var frameLen:int = frames.length;
- var canvasBytes:ByteArray;
- for(var i:int = 0; i < frameLen; i++)
- {
- frame = frames[i];
- frameInfo = mcInfo.getValue(frame);
- frameType = frameInfo["type"];
- fileBytes.writeByte(frameType);//写入帧类型
-
- if(frameType == McFrameType.KEY)
- {
- fileBytes.writeShort(frameInfo["offsetX"]);//写入X偏移量
- fileBytes.writeShort(frameInfo["offsetY"]);//写入Y偏移量
-
- canvasBytes = CanvasEncoder.encode(frameInfo["bitmapData"]);
- fileBytes.writeBytes(canvasBytes);
- }
- }
- }
-
- /**
- * 判断两个colorTransform是否一致
- * @param colorTransform1:ColorTransform 对比1
- * @param colorTransform2:ColorTransform 对比2
- */
- public static function compareColorTransform(colorTransform1:ColorTransform, colorTransform2:ColorTransform):Boolean
- {
- if(colorTransform1.alphaMultiplier != colorTransform2.alphaMultiplier)
- {
- return false;
- }
- if(colorTransform1.redMultiplier != colorTransform2.redMultiplier)
- {
- return false;
- }
- if(colorTransform1.greenMultiplier != colorTransform2.greenMultiplier)
- {
- return false;
- }
- if(colorTransform1.blueMultiplier != colorTransform2.blueMultiplier)
- {
- return false;
- }
- if(colorTransform1.alphaOffset != colorTransform2.alphaOffset)
- {
- return false;
- }
- if(colorTransform1.redOffset != colorTransform2.redOffset)
- {
- return false;
- }
- if(colorTransform1.greenOffset != colorTransform2.greenOffset)
- {
- return false;
- }
- if(colorTransform1.blueOffset != colorTransform2.blueOffset)
- {
- return false;
- }
- return true;
- }
-
- /**
- * 播放子级
- */
- private static function playChilds(container:DisplayObjectContainer, childPlayDic:Dictionary):void
- {
- if(!container)
- {
- return;
- }
- for(var i:int = 0; i < container.numChildren; i++)
- {
- playMc(container.getChildAt(i) as MovieClip, childPlayDic);
- }
- }
-
- /**
- * 播放影片
- */
- private static function playMc(mc:MovieClip, childPlayDic:Dictionary):void
- {
- if(!mc)
- {
- return;
- }
-
- var playData:Array;
- if(mc in childPlayDic)
- {
- playData = childPlayDic[mc];
- }
- else
- {
- playData = [false, 1];
- childPlayDic[mc] = playData;
- }
-
- var played:Boolean = playData[0];
- if(!played)
- {
- var frame:int = playData[1] + 1;
- mc.gotoAndStop(frame);
- playData[0] = true;
- playData[1] = frame;
- }
-
- playChilds(mc, childPlayDic);
- }
-
- /**
- * 判断是否是复刻帧
- * @param preBmd:BitmapData 前一帧的位图数据
- * @param nowBmd:BitmapData 当前帧的位图数据
- */
- private static function isCopy(preBmd:BitmapData, nowBmd:BitmapData):Boolean
- {
- if(!preBmd)
- {
- return false;
- }
- return nowBmd.compare(preBmd) == 0;
- }
-
- /**
- * 从影片信息中获取位图数据
- */
- private static function getBitmapDatas(mcInfo:HashMap):Vector.<BitmapData>
- {
- var bmdList:Vector.<BitmapData> = new Vector.<BitmapData>();
- var frames:Array = getKeyFrames(mcInfo);
- var len:int = frames.length;
- if(len > 0)
- {
- var bmd:BitmapData;
- var frame:int;
- var info:Object;
- for(var i:int = 0; i < len; i++)
- {
- frame = frames[i];
- info = mcInfo.getValue(frame);
- bmd = info["bitmapData"];
- bmdList.push(bmd);
- }
- }
- else
- {
- LogWin.showLog("位图数据为空!");
- }
- return bmdList;
- }
-
- /**
- * 从影片信息中获取关键帧列表
- */
- private static function getKeyFrames(mcInfo:HashMap):Array
- {
- var frames:Array = [];
- mcInfo.eachKey(function(frame:int):void{
- var info:Object = mcInfo.getValue(frame);
- if(info["bitmapData"])
- {
- frames.push(frame);
- }
- });
- frames.sort(Array.NUMERIC);
- return frames;
- }
- }
- }
复制代码
|
|