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;
}
}
}
浙公网安备 33010602011771号