package org.lzyy.util { |
import flash.display.*; |
import flash.geom.*; |
import flash.filters.*; |
/** |
* as.Filter |
* |
* as3.Filter class includes methods generate variety of filters for image processing. |
*/ |
public class Filter |
{ |
/** |
* Generate the DisplacementMapFilter for twirling effect. |
* |
* You can apply the filter is as follows: |
* |
* var bmd:BitmapData = new BitmapData(width, height, false); |
* var filter:DisplacementMapFilter = Filter.twirlFilter(bmd); |
* bmd.draw(video); |
* bmd.applyFilter(bmd, bmd.rect, new Point(0, 0), filter); |
* |
* You can also apply the filter specified region: |
* |
* var region:Rectangle = new Rectangle(100, 100, 100, 100); |
* var filter:DisplacementMapFilter = Filter.twirlFilter(bmd, rect); |
* |
* @params source BitmapData The input bitmap data to apply the twirling effect. |
* @params region Rectangle The region to apply the twirling effect. |
* @params rotation Number The max amount to rotate, in radius. |
* Default is Math.PI / 2. |
* |
* @return DisplacementMapFilter Filter to apply twirl effect |
*/ |
static public function twirlFilter(source:BitmapData, region:Rectangle=null, |
rotation:Number=0):DisplacementMapFilter |
{ |
var width:int = source.width; |
var height:int = source.height; |
region ||= new Rectangle(0, 0, width, height); |
rotation ||= Math.PI / 2; |
var dbmd:BitmapData = new BitmapData(width, height, false, 0x8080); |
var radius:Number = Math.min(region.width, region.height) / 2; |
var centerX:int = region.x + region.width / 2; |
var centerY:int = region.y + region.height / 2; |
for(var y:int=0;y<height;++y) { |
var ycoord:int = y - centerY; |
for(var x:int=0;x<width;++x) { |
var xcoord:int = x - centerX; |
var dr:Number = radius - Math.sqrt(xcoord * xcoord + ycoord * ycoord); |
if(dr > 0) { |
var angle:Number = dr / radius * rotation; |
var dx:Number = xcoord * Math.cos(angle) - ycoord * Math.sin(angle) - xcoord; |
var dy:Number = xcoord * Math.sin(angle) + ycoord * Math.cos(angle) - ycoord; |
var blue:int = 0x80 + Math.round(dx / width * 0xff); |
var green:int = 0x80 + Math.round(dy / height * 0xff); |
dbmd.setPixel(x, y, green << 8 | blue); |
} |
} |
} |
return new DisplacementMapFilter(dbmd, |
new Point(0, 0), |
BitmapDataChannel.BLUE, |
BitmapDataChannel.GREEN, |
width, |
height, |
DisplacementMapFilterMode.IGNORE); |
} |
/** |
* Generate the BitmapData which applied mirror effect. |
* |
* You can create the mirrored BitmapData is as follows: |
* |
* var bmd = new BitmapData(video.width, video.height, false); |
* bmd.draw(video); |
* var mirroredBmd = Filter.mirror(bmd); |
* |
* @params source BitmapData The input bitmap data to apply the mirror effect. |
* @params region Rectangle The region to apply the twirling effect. Default is entire region. |
* @return BitmapData BitmapData which applied the mirror effect |
*/ |
static public function mirror(source:BitmapData):BitmapData |
{ |
var bmd:BitmapData = new BitmapData(source.width, source.height, false); |
var halfWidth:int = Math.round(source.width / 2); |
source.lock(); |
bmd.copyPixels(source, new Rectangle(0, 0, halfWidth, source.height), new Point(0,0)); |
for(var i:int=0;i<source.height;++i) { |
for(var j:int=0;j<halfWidth;++j) { |
bmd.setPixel32(halfWidth + j, i, source.getPixel32(halfWidth - j, i)); |
} |
} |
source.unlock(); |
return bmd; |
} |
/** |
* Generate the DisplacementMapFilterMode for pinch effect. |
* |
* You can apply the filter is as follows: |
* |
* var bmd:BitmapData = new BitmapData(width, height, false); |
* var filter:DisplacementMapFilter = Filter.pinchFilter(bmd); |
* bmd.draw(video); |
* bmd.applyFilter(bmd, bmd.rect, new Point(0, 0), filter); |
* |
* You can also apply the filter specified region: |
* |
* var region:Rectangle = new Rectangle(100, 100, 100, 100); |
* var amount:Number = 0.5; |
* var filter:DisplacementMapFilter = Filter.pinchFilter(bmd, rect, amount); |
* |
* @params source BitmapData The input bitmap data to apply the twirling effect. |
* @params region Rectangle The region to apply the twirling effect. |
* @params amount Number Amount of pinch. (-1 <= x <= 1) |
* Default is 0.35. |
*/ |
static public function pinchFilter(source:BitmapData, region:Rectangle=null, |
amount:Number=0.35):DisplacementMapFilter |
{ |
var width:int = source.width; |
var height:int = source.height; |
region ||= new Rectangle(0, 0, width, height); |
var radius:Number = Math.min(region.width, region.height) / 2; |
var centerX:int = region.x + region.width / 2; |
var centerY:int = region.y + region.height / 2; |
var dbmd:BitmapData = new BitmapData(width, height, false, 0x8080); |
for(var y:int=0;y<height;++y) { |
var ycoord:int = y - centerY; |
for(var x:int=0;x<width;++x) { |
var xcoord:int = x - centerX; |
var d:Number = Math.sqrt(xcoord * xcoord + ycoord * ycoord); |
if(d < radius) { |
var t:Number = d == 0 ? 0 : Math.pow(Math.sin(Math.PI / 2 * d / radius), -amount); |
var dx:Number = xcoord * (t - 1) / width; |
var dy:Number = ycoord * (t - 1) / height; |
var blue:int = 0x80 + dx * 0xff; |
var green:int = 0x80 + dy * 0xff; |
dbmd.setPixel(x, y, green << 8 | blue); |
} |
} |
} |
return new DisplacementMapFilter(dbmd, |
new Point(0, 0), |
BitmapDataChannel.BLUE, |
BitmapDataChannel.GREEN, |
width, |
height, |
DisplacementMapFilterMode.CLAMP); |
} |
/** |
* Generate the DisplacementMapFilter for photic tunnel effect. |
* Photic tunnel effect is as same as effect of Photo Booth application in Mac OS. |
* |
* You can apply the filter is as follows: |
* |
* var bmd:BitmapData = new BitmapData(width, height, false); |
* var filter:DisplacementMapFilter = Filter.pinchFilter(bmd); |
* bmd.draw(video); |
* bmd.applyFilter(bmd, bmd.rect, new Point(0, 0), filter); |
* |
* @params source BitmapData The input bitmap data to apply the twirling effect. |
* @params region Rectangle The region to apply the twirling effect. |
* @return DisplacementMapFilter Filter to apply photic tunnel effect. |
*/ |
static public function photicTunnelFilter(source:BitmapData, region:Rectangle=null):DisplacementMapFilter |
{ |
var width:int = source.width; |
var height:int = source.height; |
region ||= new Rectangle(0, 0, width, height); |
var centerX:int = region.x + region.width / 2; |
var centerY:int = region.y + region.height / 2; |
var dbmd:BitmapData = new BitmapData(width, height, false, 0x8080); |
var radius:Number = Math.min(region.width, region.height) / 2; |
for(var y:int=0;y<height;++y) { |
var ycoord:int = y - centerY; |
for(var x:int=0;x<width;++x) { |
var xcoord:int = x - centerX; |
var d:Number = Math.sqrt(xcoord * xcoord + ycoord * ycoord); |
if(radius < d) { |
var angle:Number = Math.atan2(Math.abs(ycoord), Math.abs(xcoord)); |
var dx:Number = (xcoord > 0? -1 : 1) * (d - radius) * Math.cos(angle) / width; |
var dy:Number = (ycoord > 0? -1 : 1) * (d - radius) * Math.sin(angle) / height; |
var blue:int = 0x80 + dx * 0xff; |
var green:int = 0x80 + dy * 0xff; |
dbmd.setPixel(x, y, green << 8 | blue); |
} |
} |
} |
return new DisplacementMapFilter(dbmd, |
new Point(0, 0), |
BitmapDataChannel.BLUE, |
BitmapDataChannel.GREEN, |
width, |
height, |
DisplacementMapFilterMode.CLAMP); |
} |
/** |
* Generate the DisplacementMapFilter for bulge effect. |
* Bulge effect is wrapper of pinchFilter method. |
* |
* @params source BitmapData The input bitmap data to apply the effect. |
* @params region Rectangle The region to apply the bulge effect. |
* @params amount Number Amount of bulge. (0 <= x <= 1) |
* @return DisplacementMapFilter The filter to apply bulge effect. |
*/ |
static public function bulgeFilter(source:BitmapData, region:Rectangle=null, |
amount:Number=0.5):DisplacementMapFilter |
{ |
// wrapper method of pinchFilter |
return pinchFilter(source, region, Math.min(-amount, -1)); |
} |
/** |
* Generate the DisplacementMapFilter for squeeze effect. |
* Dent effect is wrapper of pinchFilter method. |
* |
* @params source BitmapData The input bitmap data to apply the effect. |
* @params region Rectangle The region to apply the bulge effect |
* @params amount Number Amount of squeeze. (0 <= x <= 1) |
*/ |
static public function squeezeFilter(source:BitmapData, region:Rectangle=null, |
amount:Number=0.5):DisplacementMapFilter |
{ |
// wrapper method of bulge filter |
return pinchFilter(source, region, amount); |
} |
/** |
* Generate the DisplacementMapFilter for fisheye effect. |
* |
* @params source BitmapData The input bitmap data to apply the twirling effect. |
* @params amount Number Amount of fisheye (0 <= x <= 1) |
* @return DisplacementMapFilter The filter to apply the fisheye effect. |
*/ |
static public function fisheyeFilter(source:BitmapData, amount:Number=0.8):DisplacementMapFilter |
{ |
var width:int = source.width; |
var height:int = source.height; |
var dbmd:BitmapData = new BitmapData(width, height, false, 0x8080); |
var centerX:int = width / 2; |
var centerY:int = height / 2; |
var radius:Number = Math.sqrt(Math.pow(width, 2) + Math.pow(height, 2)); |
for(var y:int=0;y<height;++y) { |
var ycoord:int = y - centerY; |
for(var x:int=0;x<width;++x) { |
var xcoord:int = x - centerX; |
var d:Number = Math.sqrt(xcoord * xcoord + ycoord * ycoord); |
if(d < radius) { |
var t:Number = d == 0 ? 0 : Math.pow(Math.sin(Math.PI / 2 * d / radius), amount); |
var dx:Number = xcoord * (t - 1) / width; |
var dy:Number = ycoord * (t - 1) / height; |
var blue:int = 0x80 + dx * 0xff; |
var green:int = 0x80 + dy * 0xff; |
dbmd.setPixel(x, y, green << 8 | blue); |
} |
} |
} |
return new DisplacementMapFilter(dbmd, |
new Point(0, 0), |
BitmapDataChannel.BLUE, |
BitmapDataChannel.GREEN, |
width, |
height, |
DisplacementMapFilterMode.CLAMP); |
} |
/** |
* Generate the DisplacementMapFilter for strech effect. |
* |
* @params source BitmapData The input bitmap data to apply the twirling effect. |
* @params amount Number Amount of strech (0 <= x <= 1), default is 0.6; |
* @return DisplacementMapFilter The filter to apply the strech effect. |
*/ |
static public function strechFilter(source:BitmapData, amount:Number=0.6):DisplacementMapFilter |
{ |
var width:int = source.width; |
var height:int = source.height; |
var dbmd:BitmapData = new BitmapData(width, height, false, 0x8080); |
var centerX:int = width / 2; |
var centerY:int = height / 2; |
var vregion:Rectangle = new Rectangle(0, 0 , width / 3, height); |
var hregion:Rectangle = new Rectangle(0, 0, width, height / 3); |
var blue:int; |
var green:int; |
for(var y:int=0;y<height;++y) { |
var ycoord:int = y - centerY; |
for(var x:int=0;x<width;++x) { |
var xcoord:int = x - centerX; |
var dx:int = (Math.abs(xcoord) < vregion.width)? |
xcoord * (Math.pow(Math.abs(xcoord) / vregion.width, amount) - 1) : 0x0; |
var dy:int = (Math.abs(ycoord) < hregion.height)? |
ycoord * (Math.pow(Math.abs(ycoord) / hregion.height, amount) - 1) : 0x0; |
blue = 0x80 + 0xff * dx / width; |
green = 0x80 + 0xff * dy / height; |
dbmd.setPixel(x, y, green << 8 | blue); |
} |
} |
return new DisplacementMapFilter(dbmd, |
new Point(0, 0), |
BitmapDataChannel.BLUE, |
BitmapDataChannel.GREEN, |
width, |
height, |
DisplacementMapFilterMode.CLAMP); |
} |
} |
} |
Saturday, July 30, 2011
Filter.as - as3-classes - my collection of useful as3 classes - Google Project Hosting
Filter.as - as3-classes - my collection of useful as3 classes - Google Project Hosting
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment