您的位置:首页 > 其它

flash位图技术研究篇(4): flash舞台屏幕录制

2010-02-17 22:40 363 查看
我们使用过屏幕录制的软件会了解怎样录制,之前想过一下怎样做,大概一个假设,采用flash复制位图的技术,就能够录制flash当中的舞台的帧。今天,我们开一个无聊话题“flash舞台屏幕录制”,把舞台当中桌面,看看怎样录制一个过程。在flash 当中,复制位图技术是一种常用的技术。



复制位图的办法有使用位图当中的draw方法,有 copyPixels,看下面的两个方法,都是针对位图数据而设立的

copyPixels(sourceBitmapData:BitmapData, sourceRect:Rectangle, destPoint:Point, alphaBitmapData:BitmapData = null, alphaPoint:Point = null, mergeAlpha:Boolean = false):void
为没有拉伸、旋转或色彩效果的图像之间的像素处理提供一个快速例程。
 

draw(source:IBitmapDrawable, matrix:Matrix = null, colorTransform:ColorTransform = null, blendMode:String = null, clipRect:Rectangle = null, smoothing:Boolean = false):void
使用 Flash Player 矢量渲染器在位图图像上绘制 source 显示对象。



我们使用其中一种办法实现这种录制的效果,录制的图片通过保存在一个数组当中,这样下来。我们就能够有效管理每一帧图片。然后通过检索数组的每一帧的内容则能够做出一种连贯的动画的效果。



好,我们先准备一些画笔,用于这次***。

下面我们先准备一支画笔:用于***绘制图形的画笔类;

package 
{
	//画笔类
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.events.*;
	import flash.geom.Point;

	public class Pen extends Sprite
	{
		private var shape:Shape=new Shape();
		private var begin:Boolean=false;
		private var point:Point;
		public function Pen()
		{
			addChild(shape);
		}
        
		//监听
		public function mouseListener():void
		{

			stage.addEventListener(MouseEvent.MOUSE_DOWN,mouseDownHandler);
			stage.addEventListener(MouseEvent.MOUSE_UP,mouseUpHandler);
			stage.addEventListener(MouseEvent.MOUSE_MOVE,mouseMoveHandler);
		}
         //开始绘制 
		public function startDraw():void
		{
			begin=true;
			point=new Point(mouseX,mouseY);
			shape.graphics.moveTo(point.x,point.y);
		}

		public function drawing():void
		{
			if (begin)
			{
				drawLine(new Point(mouseX,mouseY));
			}
		}
        //停止绘制
		public function stopDraw():void
		{
			begin=false;
		}

		private function mouseDownHandler(event:MouseEvent):void
		{
			this.dispatchEvent(new Event("StartDraw"));
		}

		private function mouseUpHandler(event:MouseEvent):void
		{
			this.dispatchEvent(new Event("EndDraw"));

		}

		private function mouseMoveHandler(event:MouseEvent):void
		{
			this.dispatchEvent(new Event("Drawing"));
		}

		//绘制线条
		private function drawLine(point:Point):void
		{
			shape.graphics.lineStyle(2,0x000000);
			shape.graphics.lineTo(point.x,point.y);
		}

		//清楚所有
		public function clearAll():void
		{
			shape.graphics.clear();
		}

	}

}






然后写一个屏幕类,用于记录flash舞台的屏幕,包括常见的复制位图的方法

public class FScreen extends EventDispatcher;继承EventDispatcher类



public function copyScreen(sorce:IBitmapDrawable,Width:Number,Height:Number):void





开始播放的方法

public function play():void



清除画面的办法

public function removeScreen():void



还有获取图片阵列的办法

public function getImageList():Vector.<BitmapData>





package 
{
	//录制flash 屏幕
	import flash.display.BitmapData;
	import flash.display.Sprite;
	import flash.geom.Rectangle;
	import flash.utils.ByteArray;
	import flash.display.IBitmapDrawable;
	import flash.events.*;
	import flash.display.GraphicsBitmapFill;
	public class FScreen extends EventDispatcher
	{

		private var list:Vector.<BitmapData>=new Vector.<BitmapData>();//图片阵列
		private var count:int=0;
		public var contain:Sprite=new Sprite();
		private var IsOver:Boolean=true;
		public function FScreen()
		{

		}

		//开始播放
		public function play():void
		{
			if (IsOver)
			{
				IsOver=false;
				trace("运行");
				contain.addEventListener(Event.ENTER_FRAME,PlayHandler);
			}
		}
		private function PlayHandler(event:Event):void
		{
			trace("wwwwwww");
			if (list.length>count)
			{
				contain.graphics.clear();
				contain.graphics.beginBitmapFill(list[count]);
				contain.graphics.drawRect(0, 0, list[count].width, list[count].height);
				contain.graphics.endFill();
				count++;
				
			}
			else
			{
				contain.removeEventListener(Event.ENTER_FRAME,PlayHandler);
				count=0;
				IsOver=true;
			}

		}

		//结束录制
		public function stop():void
		{
			contain.removeEventListener(Event.ENTER_FRAME,PlayHandler);
			IsOver=true;
		}

		//复制屏幕像素,宽度和高度可以指定
		public function copyScreen(sorce:IBitmapDrawable,Width:Number,Height:Number):void
		{
			var bitmapdata:BitmapData=new BitmapData(Width,Height);
			bitmapdata.draw(sorce);
			list.push(bitmapdata);
		}

		//删除屏幕当中的数据

		public function removeScreen():void
		{
			while (list.length>0)
			{
				list.pop();
			}
			contain.graphics.clear();
		}

		//获取图片阵列
		public function getImageList():Vector.<BitmapData>
		{
			return list;

		}

	}

}




代码测试:

package 
{

	import flash.display.Sprite;
	import flash.events.*;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.system.System;
	import flash.utils.Timer;
	public class Main extends Sprite
	{
		private var mypen:Pen=new Pen();
		private var myscreen:FScreen=new FScreen();//创建录制
		private var imagrList:Vector.<BitmapData>;
		private var count:int=0;
		private var time:Timer;
		public function Main()
		{
			
			addChild(mypen);
			mypen.mouseListener();
			mypen.addEventListener("StartDraw",StartDrawHandler);
			mypen.addEventListener("Drawing",DrawingHandler);
			mypen.addEventListener("EndDraw",EndDrawHandler);
			
			time=new Timer(200);//每200毫秒绘制一张图片
			time.addEventListener(TimerEvent.TIMER,onTimer);

			stage.addEventListener(Event.ENTER_FRAME,Run);
			Btn_end.addEventListener(MouseEvent.MOUSE_DOWN,keyEndHandler);
			Btn_start.addEventListener(MouseEvent.MOUSE_DOWN,keyStartHandler);
			
		}

		private function StartDrawHandler(event:Event):void
		{
			mypen.startDraw();
		}

		private function DrawingHandler(event:Event):void
		{
			mypen.drawing();
		}

		private function EndDrawHandler(event:Event):void
		{
			mypen.stopDraw();
		}

		//每一帧运行
		private function Run(event:Event):void
		{
			//内存监控
			Memory.text=System.totalMemory/1024+"/kb";
		}

		private function keyEndHandler(event:MouseEvent):void
		{
			time.stop();//时间停止
			addChild(myscreen.contain);
			myscreen.play();
		}

		private function keyStartHandler(event:MouseEvent):void
		{
			myscreen.removeScreen();//清楚画面
			mypen.clearAll();			
			time.start();
		}

		private function onTimer(event:TimerEvent):void
		{
			myscreen.copyScreen(this,stage.stageWidth,stage.stageHeight-20);//录制画面
			trace("ww");
		}

	}

}




其中:

Btn_end.addEventListener(MouseEvent.MOUSE_DOWN,keyEndHandler);
Btn_start.addEventListener(MouseEvent.MOUSE_DOWN,keyStartHandler);



两个按钮在舞台里面创建,并分别在属性面板命名为Btn_end.,和Btn_start。使用影片剪辑即可







运行的效果:

我们按了开始录制的时候,先随便的使用画笔绘制一张画面,然后按停止绘制画面。进行播放

addChild(myscreen.contain);
myscreen.play();//进行播放



我们使用的Timer 来复制图片,而不是每一帧执行事件来复制,这样做好处,减少图片每一帧的复制,减少内存。但是无论如何使用都好,这种保存的办法,最终会导致内存增大。程序会变得越来越慢。而这个是必然结果。 不知道是否存在一种图形压缩算法减少图片的大小。

不过,对这个程序来讲,知道flash 复制位图的使用,这样就可以了。或者我们制造的air 程序 外部保存到外部,这样会减少内存占用量

或者可以尝试***一下。



绘制一个老虎,看看自己如何画的?呵呵



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: