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

Webcam Ghosts: Alpha

Someone was asking me how you might do this effect.  So I figured I would show them on Wonderfl...

Thanks WonderFL!  This site rocks!
// forked from pokipoki_film's forked from: Webcam Ghosts
// forked from rigard's Webcam Ghosts
// code by rigardkruger (http://www.rigardkruger.com)
// need a webcam
package 
{
    import flash.system.LoaderContext;
    import flash.net.URLRequest;
    import flash.display.Loader;
    
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.BlendMode;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.TimerEvent;
    import flash.filters.BlurFilter;
    import flash.filters.GlowFilter;
    import flash.geom.ColorTransform;
    import flash.geom.Point;
    import flash.geom.Rectangle;
    import flash.media.Camera;
    import flash.media.Video;
    import flash.utils.Timer;
    
    [SWF(backgroundColor = 0x000000, frameRate = 30)]
    
    /**
     * ...
     * @author Rigard Kruger
     */
    public class Webcam extends Sprite 
    {
        
        private var _width:int;
        private var _height:int;
        
        private var _video:Video;
        private var _output:Bitmap;
        private var _olddata:BitmapData;
        private var _data:BitmapData;
        private var _rect:Rectangle;
        
        private var _pixelarray:Array;
        
        private var loader:Loader;
        //http://www.flickr.com/photos/88403964@N00/2662752839/ (by clockmaker)
        private var url:String = "http://farm4.static.flickr.com/3190/2662752839_249c6642b1.jpg";
        private var img:Bitmap;
        
        public function Webcam()
        {
 /*           var context:LoaderContext = new LoaderContext(true);
            loader = new Loader();
            loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
            loader.load(new URLRequest(url), context);
        }
        
        private function onComplete( event:Event ):void
        {
            img = loader.content as Bitmap;
            addChild(img);
            */
            var camera:Camera = Camera.getCamera();
            if (camera != null)
            {
                _video = new Video(160, 120);
                _video.attachCamera(camera);
                addChild(_video);
            }
            else
            {
                // no good
            }
            
            _width = _video.width;
            _height = _video.height;
            _rect = new Rectangle(0, 0, _width, _height);
            
            _data = new BitmapData(_width, _height, true, 0xFF000000);
            _olddata = new BitmapData(_width, _height, true, 0x00000000);
            
            _pixelarray = [];
            
            _output = new Bitmap(_data);
            _output.smoothing = true;
            addChild(_output);
            
            _output.width = stage.stageWidth;
            _output.height = stage.stageHeight;
            
            _video.width = stage.stageWidth;
            _video.height = stage.stageHeight;
            
            var timer:Timer = new Timer(1);
            timer.addEventListener(TimerEvent.TIMER, onTimer);
            timer.start();
        }
        
        private function onTimer(e:TimerEvent) : void
        {
            var bd:BitmapData = new BitmapData(_width, _height, true, 0xffffffff);
            bd.draw(_video);
            bd.draw(_olddata, null, null, BlendMode.DIFFERENCE);
            
            bd.threshold(bd, _rect, new Point(), ">", 0xff222222, 0xff00ff00, 0x00ffffff, false);
            bd.threshold(bd, _rect, new Point(), "!=", 0xff00ff00, 0xff000000, 0x00ffffff, false);
            
            _data.lock();
            
            for (var i:int = 0; i < _width; i++)
            {
                for (var j:int = 0; j < _height; j++)
                {
                    
                    if (bd.getPixel32(i, j) == 0xff00ff00)
                    {
                        _pixelarray.push(new Pixel(i, j, 0x00ffffff));
                    }
                    
                }
            }
            
            _pixelarray = _pixelarray.slice(0, 5000);
            var numPixels:int = _pixelarray.length;
            for (i = 0; i < numPixels; i++)
            {
                var p:Pixel = _pixelarray[i];
                p.x += Math.random() * 2 - 1;
                p.y += Math.random() * 3 - 1;
                _data.setPixel32(p.x, p.y, p.c);
                p.l++;
                
                if (p.l > 10)
                {
                    _pixelarray.splice(i--, 1);
                    numPixels--;
                }
                
            }
            
            var ct:ColorTransform = new ColorTransform();
          //ct.alphaMultiplier = 0.96;
            ct.greenMultiplier = ct.blueMultiplier = ct.redMultiplier = 0.96;
            _data.colorTransform(_rect, ct);
            
            _data.applyFilter(_data, _rect, new Point(), new GlowFilter(0x33ff33, 1, 6, 6, 0.1));
            _data.applyFilter(_data, _rect, new Point(), new BlurFilter(2, 2));
            
            _data.unlock();
            
            _output.width = stage.stageWidth;
            
            _olddata.draw(_video);
        }
        
    }
    
}

class Pixel
{
    public var x:int;
    public var y:int;
    public var c:uint;
    public var l:int;
    
    public function Pixel(x:int, y:int, c:uint, l:int = 0)
    {
        this.x = x;
        this.y = y;
        this.c = c;
        this.l = l;
    }
}