Have you ever tried to create an alpha mask using Actionscript 3.0?
The thing is reachable with the method copyChannel of the BitmapData class.
- Load an external image
- Create a new instance of BitmapData (bitmap_data) and assign it to bitmapData property of the external bitmap
- Create a new instance of BitmapData (bitmap_data_copy) with same size of external bitmap
- Copy the pixels of external bitmap in the new instance bitmap_data_copy
- Use the dispose method on bitmap_data to free memory
- Create a mask form using a Shape
- Create a new instance of BitmapData (bitmap_data_shape) the same size of external image and use draw method over shape
- bitmap_data_copy uses the method copyChannel on bitmap_data_shape
- Give bitmap_data_copy to property bitmapData of external image
package { import flash.display.*; import flash.events.*; import flash.net.*; import flash.geom.*; import flash.filters.*; public class Main extends MovieClip { private var loaded_bitmap:Bitmap; private var bitmap_data:BitmapData; private var bitmap_data_copy:BitmapData; private var bitmap_data_shape:BitmapData; private var shape:Shape; public function Main() { addEventListener(Event.ADDED_TO_STAGE,init); addEventListener(Event.REMOVED_FROM_STAGE,destroy); } private function init(evt:Event):void { removeEventListener(Event.ADDED_TO_STAGE,init); loadImage(); } private function loadImage():void { var request:URLRequest=new URLRequest("tiger.jpg"); var loader:Loader=new Loader(); loader.contentLoaderInfo.addEventListener(Event.COMPLETE,onImageLoaded); loader.load(request); } private function onImageLoaded(evt:Event):void { evt.target.removeEventListener(Event.COMPLETE,onImageLoaded); loaded_bitmap=evt.target.loader.content as Bitmap; createAlphaMask(); } private function createAlphaMask():void { bitmap_data=loaded_bitmap.bitmapData; var w:Number=bitmap_data.width; var h:Number=bitmap_data.height; bitmap_data_copy=new BitmapData(w,h,true,0x00FFFFFF); bitmap_data_copy.copyPixels(bitmap_data,bitmap_data.rect,new Point()); bitmap_data.dispose(); shape=createMask(w,h); bitmap_data_shape=new BitmapData(w,h,true,0x00FFFFFF); bitmap_data_shape.draw(shape); bitmap_data_copy.copyChannel(bitmap_data_shape,bitmap_data_shape.rect,new Point(),BitmapDataChannel.ALPHA,BitmapDataChannel.ALPHA); loaded_bitmap.bitmapData=bitmap_data_copy; addChild(loaded_bitmap); } private function createMask(w:Number,h:Number):Shape { var new_shape:Shape=new Shape(); new_shape.graphics.beginFill(0xFFFFFF); new_shape.graphics.drawEllipse(50,50,w-100,h-100); new_shape.graphics.endFill(); var blur_filter:BlurFilter=new BlurFilter(50,50,BitmapFilterQuality.HIGH); new_shape.filters=[blur_filter]; addChild(new_shape); return new_shape; } private function destroy(evt:Event):void { removeEventListener(Event.REMOVED_FROM_STAGE,destroy); bitmap_data_copy.dispose(); bitmap_data_shape.dispose(); removeChild(loaded_bitmap); removeChild(shape); loaded_bitmap=null; shape=null; } } }