In case Flash no longer exists; a copy of this site is included in the Flashpoint archive's "ultimate" collection.

Dead Code Preservation :: Archived AS3 works from wonderfl.net

色の変化している部分を抜き出す

直前のフレームと比較して色の変化している部分を抜き出す。

両方のフレームをgetPixelして比較すると、
計算量が多くなりそうな気がしたので、
まずはBlendModeのdifferenceで比較してから(右上)、
差の大きい部分のみを取り出している(右下)。

でも、これで意味があるほど計算量が減っているのかどうかの
確認はしていない。


参考
http://un-q.net/2007/01/actionscript3web.html
Get Adobe Flash player
by umhr 13 Mar 2010
/**
 * Copyright umhr ( http://wonderfl.net/user/umhr )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/8ekB
 */

/*
直前のフレームと比較して色の変化している部分を抜き出す。

両方のフレームをgetPixelして比較すると、
計算量が多くなりそうな気がしたので、
まずはBlendModeのdifferenceで比較してから(右上)、
差の大きい部分のみを取り出している(右下)。

でも、これで意味があるほど計算量が減っているのかどうかの
確認はしていない。


参考
http://un-q.net/2007/01/actionscript3web.html
*/
package {
	import flash.display.Sprite;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
	import flash.events.*;
	import flash.media.Camera;
	import flash.media.Video;
	import flash.utils.Timer;
	
	public class CameraEx extends Sprite {
		
		private var video:Video;
//		private var btn:Sprite;
		private var _bitmapProcess:BitmapProcess;
		
		public function CameraEx() {
			
			stage.scaleMode = StageScaleMode.NO_SCALE;
			stage.align = StageAlign.TOP_LEFT;
			
			// camera
			var camera:Camera = Camera.getCamera();
			
			if (camera != null) {
				video = new Video(camera.width, camera.height);
				video.attachCamera(camera);
				addChild(video);
			} else {
				trace("You need a camera.");
			}
			
			
			_bitmapProcess = new BitmapProcess();
			_bitmapProcess.x = camera.width;
			this.addChild(_bitmapProcess);
			
//			// button
//			btn = new Sprite();
//			btn.buttonMode = true
//			btn.graphics.beginFill(0x333333);
//			btn.graphics.drawRect(0,0,100,30);
//			btn.y = camera.height + 10;            
//			addChild(btn);
//			btn.addEventListener(MouseEvent.MOUSE_UP, btnUp);
			
			var timer:Timer = new Timer(100,9999);
			timer.addEventListener(TimerEvent.TIMER,onTime);
			timer.start();
		}
		private function onTime(e:TimerEvent):void {
			_bitmapProcess.setBitmap(video);
		}
		
//		private function btnUp(e:MouseEvent):void {
//			_bitmapProcess.setBitmap(video);
//		}
	}
}

import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Sprite;
//import flash.geom.ColorTransform;
import flash.geom.Rectangle;
import flash.media.Video;

class BitmapProcess extends Sprite{
	private var _bitmap0:Bitmap;
	private var _bitmap1:Bitmap;
	private var _bitmap2:Bitmap;
	private var _bitmapData0:BitmapData;
	private var _bitmapData1:BitmapData;
	private var _bitmapData2:BitmapData;
	public function BitmapProcess(){
		_bitmapData0 = new BitmapData(160,120,false,0x000000);
		_bitmap0 = new Bitmap(_bitmapData0);
		_bitmap0.scaleX = _bitmap0.scaleY = 2;
		this.addChild(_bitmap0);
		
		_bitmapData1 = new BitmapData(160,120,false,0x000000);
		_bitmap1 = new Bitmap(_bitmapData1);
		_bitmap1.scaleX = _bitmap1.scaleY = 2;
		_bitmap1.y = 240;
		this.addChild(_bitmap1);
		
		_bitmapData2 = new BitmapData(160,120,false,0x000000);
		_bitmap2 = new Bitmap(_bitmapData2);
//		_bitmap2.scaleX = _bitmap2.scaleY = 2;
//		_bitmap2.y = 500;
//		this.addChild(_bitmap2);
	}
	public function setBitmap(video:Video):void{
		_bitmapData0.draw(video);
		_bitmapData0.draw(_bitmap2,null,null,"difference");
		_bitmapData2.draw(video);
		
		_bitmapData1.lock();
		_bitmapData1.fillRect(new Rectangle(0,0,160,120),0xFF);
		var n:int = _bitmapData0.height;
		var m:int = _bitmapData0.width;
		for (var i:int = 0; i < n; i++) {
			for (var j:int = 0; j < m; j++) {
				if(getGray(_bitmapData0.getPixel(j,i))>8){
					_bitmapData1.setPixel(j,i,_bitmapData2.getPixel(j,i));
				}
			}
		}
		_bitmapData1.unlock();
	}
	public function getGray(rgb:uint):int{
		var r:int = rgb >> 16 & 0xFF;
		var g:int = rgb >> 8 & 0xFF;
		var b:int = rgb & 0xFF;
		return (r+g+b)/3;
	}
}