[ActionScript 3.0] AS3 ConvolutionFilter卷积滤镜的应用

时间:2021-10-16 11:08:05

ConvolutionFilter 类应用矩阵盘绕滤镜效果。卷积将输入图像的像素与相邻的像素合并以生成图像。通过卷积,可以实现大量的图像效果,包括模糊、边缘检测、锐化、浮雕和斜角。您可以将滤镜应用于任何显示对象(即,从 DisplayObject 类继承的对象),例如 MovieClip、SimpleButton、TextField 和 Video 对象,以及 BitmapData 对象。

要创建卷积滤镜,请使用语法 new ConvolutionFilter()。滤镜的具体使用取决于要应用滤镜的对象:

  • 要对影片剪辑、文本字段、按钮和视频应用滤镜,请使用 filters 属性(继承自 DisplayObject)。设置对象的 filters 属性不会修改相应的对象,而清除 filters 属性可以删除相应的滤镜。
  • 要对 BitmapData 对象应用滤镜,请使用 BitmapData.applyFilter() 方法。对 BitmapData 对象调用 applyFilter() 会取得源 BitmapData 对象和滤镜对象,并最终生成一个过滤图像。

如果对显示对象应用滤镜,则该对象的 cacheAsBitmap 属性值将设置为 true。如果清除所有滤镜,将恢复 cacheAsBitmap 的原始值。

如果所得图像超过最大尺寸,则不应用滤镜。在 AIR 1.5 和 Flash Player 10 中,最大宽度或高度为 8,191 像素,并且像素总数不能超过 16,777,215 像素。(因此,如果图像的宽度为 8,191 像素,则其高度只能为 2,048 像素。)在 Flash Player 9 及早期版本和 AIR 1.1 及早期版本中,高度最大为 2,880 像素,宽度最大为 2,880 像素。例如,如果在放大某大型影片剪辑时应用了滤镜,则所得图像超过最大尺寸时,将关闭该滤镜。

 package
{
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.filters.BitmapFilter;
import flash.filters.ConvolutionFilter;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize; /**
* @author Frost.Yen
* @E-mail 871979853@qq.com
* @create 2015-9-16 下午2:05:36
*
*/
public class ConvolutionFilterTest extends Sprite
{
private var size:uint = 140;
private var url:String = "ConvolutionFilter.png"; public function ConvolutionFilterTest()
{
buildChild(applyNothing);
buildChild(applyBrightness);
buildChild(applySharpness);
buildChild(applyOutline); }
private function buildChild(loadHandler:Function):void {
var loader:Loader = new Loader();
loader.x = numChildren * size;
loader.y = size;
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, ioErrorHandler);
if(loadHandler != null) {
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadHandler);
} var request:URLRequest = new URLRequest(url);
loader.load(request);
addChild(loader);
} private function applyNothing(event:Event):void {
var child:DisplayObject = DisplayObject(event.target.loader);
applyLabel(child, "no filter");
} private function applyBrightness(event:Event):void {
var child:DisplayObject = DisplayObject(event.target.loader);
var matrix:Array = [5, 5, 5,
5, 0, 5,
5, 5, 5];
applyFilter(child, matrix);
applyLabel(child, "brightness");
} private function applySharpness(event:Event):void {
var child:DisplayObject = DisplayObject(event.target.loader);
var matrix:Array = [0, -1, 0,
-1, 20, -1,
0, -1, 0];
applyFilter(child, matrix);
applyLabel(child, "sharpness");
} private function applyOutline(event:Event):void {
var child:DisplayObject = DisplayObject(event.target.loader);
var matrix:Array = [-30, 30, 0,
-30, 30, 0,
-30, 30, 0];
applyFilter(child, matrix);
applyLabel(child, "outline");
} private function applyFilter(child:DisplayObject, matrix:Array):void {
var matrixX:Number = 3;
var matrixY:Number = 3;
var divisor:Number = 9;
var filter:BitmapFilter = new ConvolutionFilter(matrixX, matrixY, matrix, divisor);
var filters:Array = new Array();
filters.push(filter);
child.filters = filters;
} private function applyLabel(child:DisplayObject, label:String):void {
var tf:TextField = new TextField();
tf.x = child.x;
tf.y = child.height;
tf.autoSize = TextFieldAutoSize.LEFT;
tf.text = label;
addChild(tf);
} private function ioErrorHandler(event:IOErrorEvent):void {
trace("Unable to load image: " + url);
} }
}