copyChannelでRGB

by y_tti
♥0 | Line 133 | Modified 2010-05-26 13:11:34 | MIT License | (replaced)
play

ActionScript3 source code

/**
 * Copyright y_tti ( http://wonderfl.net/user/y_tti )
 * MIT License ( http://www.opensource.org/licenses/mit-license.php )
 * Downloaded from: http://wonderfl.net/c/1Vd0
 */

package
{
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.BitmapDataChannel;
	import flash.display.BlendMode;
	import flash.display.Loader;
	import flash.display.LoaderInfo;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Matrix;
	import flash.geom.Point;
	import flash.geom.Rectangle;
	import flash.net.URLRequest;
	import flash.system.ApplicationDomain;
	import flash.system.LoaderContext;
	import flash.system.SecurityDomain;
	
	[SWF(width = "465", height = "465", frameRate = "30", backgroundColor = "0x000000")]
	public class ytti_rgbTest extends Sprite
	{
		//[Embed(source="test.jpg")] private var TestImage:Class;
		//private var _imageBmd:BitmapData = Bitmap(new TestImage()).bitmapData;
		private var _imageBmd:BitmapData
		private var _mouseOnFlg:Boolean = false;
		private var _line:Shape;
		private var _linebasePt:Point;
		private var _images:Array;
		
		public function ytti_rgbTest()
		{
			//_init();
			//画像ロード
			var context:LoaderContext = new LoaderContext;
			context.checkPolicyFile = true;
			context.applicationDomain = ApplicationDomain.currentDomain;
			context.securityDomain = SecurityDomain.currentDomain;
			
			var url:String = "http://assets.wonderfl.net/images/related_images/c/c1/c1f2/c1f20299091a2bcfac2d52a254169bc849720cf4";
			var loader:Loader = new Loader();
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE , _loadCompHandler );
			loader.load( new URLRequest(url) , context);
		}
		
		private function _loadCompHandler(e:Event):void {
			//bitmapdata取得
			LoaderInfo(e.target).removeEventListener(Event.COMPLETE , _loadCompHandler );
			_imageBmd = Bitmap(LoaderInfo(e.target).content).bitmapData;
			
			_init();
		}
		
		private function _init():void {
			_images = [];
			var rgbBmds:Array = _createRGBBmd(_imageBmd);	//RGBのBitmapData作成
			for(var i:int = 0;i < rgbBmds.length;i++ ){
				var bmd:BitmapData = rgbBmds[i];
				var img:Img = new Img(bmd);
				img.blendMode = BlendMode.ADD;
				addChild(img);
				_images.push(img);
				img.x = i*10;
			}
			
			stage.addEventListener(MouseEvent.MOUSE_DOWN , _mouseDownHandler );
			addEventListener(Event.ENTER_FRAME , _update );
		}
		
		private function _createRGBBmd($bmd:BitmapData):Array {
			var rect:Rectangle = new Rectangle( 0, 0, $bmd.width , $bmd.height );
			var p:Point = new Point(0,0);
			var r:BitmapData = new BitmapData( $bmd.width , $bmd.height , true , 0xFF000000 );
			var g:BitmapData = new BitmapData( $bmd.width , $bmd.height , true , 0xFF000000 );
			var b:BitmapData = new BitmapData( $bmd.width , $bmd.height , true , 0xFF000000 );
			r.copyChannel( $bmd , rect , p , BitmapDataChannel.RED , BitmapDataChannel.RED );
			g.copyChannel( $bmd , rect , p , BitmapDataChannel.GREEN , BitmapDataChannel.GREEN );
			b.copyChannel( $bmd , rect , p , BitmapDataChannel.BLUE , BitmapDataChannel.BLUE );
			return [r,g,b];
		}
		
		private function _mouseDownHandler(e:MouseEvent):void {
			//マウスオン時のライン
			_line = new Shape();
			addChild(_line);
			_linebasePt = new Point(mouseX,mouseY);
			
			_mouseOnFlg = true;
			stage.addEventListener(MouseEvent.MOUSE_UP , _mouseUpHandler );
		}
		
		private function _mouseUpHandler(e:MouseEvent):void {
			//マウスオン時のライン
			if(_line) {
				removeChild(_line);
				_line = null;
			}
			_mouseOnFlg = false;
			stage.removeEventListener(MouseEvent.MOUSE_UP , _mouseUpHandler );
		}
		
		private function _update(e:Event):void {
			var i:int;
			var img:Img;
			var dx:Number = 0;
			var dy:Number = 0;
			var vx:Number = 0;
			var vy:Number = 0;
			
			if(_mouseOnFlg){
				_line.graphics.clear();
				_line.graphics.lineStyle(1,0xFFFF00);
				_line.graphics.moveTo(_linebasePt.x,_linebasePt.y);
				_line.graphics.lineTo(mouseX,mouseY);
				
				dx = _linebasePt.x-mouseX;
				dy = _linebasePt.y-mouseY;
				for(i = 0;i < _images.length;i++ ){
					img = _images[i];
					img.x = dx * (i+1)/_images.length ;
					img.y = dy * (i+1)/_images.length;
				}
			} else {
				//バネ運動
				for(i = 0;i < _images.length;i++ ){
					img = _images[i];
					img.dx = 0-img.x;
					img.dy = 0-img.y;
					img.ax = img.dx * 0.1;
					img.ay = img.dy * 0.1;
					img.vx += img.ax;
					img.vy += img.ay;
					img.vx *= 0.9;
					img.vy *= 0.9;
					img.x += img.vx;
					img.y += img.vy;
				}
			}
		}
		
	}
}
import flash.display.Bitmap;
import flash.display.BitmapData;


class Img extends Bitmap{
	public var dx:Number = 0;
	public var dy:Number = 0;
	public var ax:Number = 0;
	public var ay:Number = 0;
	public var vx:Number = 0;
	public var vy:Number = 0;
	public function Img($bmd:BitmapData){
		super($bmd);
	}
}