| 包 | flash.filters |
| 类 | public class ConvolutionFilter |
| 继承 | ConvolutionFilter BitmapFilter Object |
| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
若要创建卷积滤镜,请使用语法 new ConvolutionFilter()。滤镜的具体使用取决于要应用滤镜的对象:
filters 属性(继承自 DisplayObject)。设置对象的 filters 属性不会修改相应的对象,而清除 filters 属性可以删除相应的滤镜。
BitmapData.applyFilter() 方法。对 BitmapData 对象调用 applyFilter() 会取得源 BitmapData 对象和滤镜对象,并最终生成一个过滤图像。
如果对显示对象应用滤镜,则该对象的 cacheAsBitmap 属性值将设置为 true。如果清除所有滤镜,将恢复 cacheAsBitmap 的原始值。
如果所得图像超过最大尺寸,则不应用滤镜。在 AIR 1.5 和 Flash Player 10 中,最大宽度或高度为 8,192 像素,并且像素总数不能超过 16,777,216 像素。(因此,如果图像的宽度为 8,192 像素,则其高度只能为 2,048 像素。)在 Flash Player 9 及早期版本和 AIR 1.1 及早期版本中,高度最大为 2,880 像素,宽度最大为 2,880 像素。 例如,如果在放大某大型影片剪辑时应用了滤镜,则所得图像超过最大尺寸时,将关闭该滤镜。
另请参见
| 属性 | 定义方 | ||
|---|---|---|---|
| alpha : Number 替换颜色的 Alpha 透明度值。 | ConvolutionFilter | ||
| bias : Number 要添加到矩阵转换结果中的偏差量。 | ConvolutionFilter | ||
| clamp : Boolean 指示是否应锁定图像。 | ConvolutionFilter | ||
| color : uint 要替换源图像之外的像素的十六进制颜色。 | ConvolutionFilter | ||
![]() | constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | |
| divisor : Number 矩阵转换中使用的除数。 | ConvolutionFilter | ||
| matrix : Array 用于矩阵转换的值的数组。 | ConvolutionFilter | ||
| matrixX : Number 矩阵的 x 维度(矩阵中列的数目)。 | ConvolutionFilter | ||
| matrixY : Number 矩阵的 y 维度(矩阵中行的数目)。 | ConvolutionFilter | ||
| preserveAlpha : Boolean 指示是否已保留 Alpha 通道并且不使用滤镜效果,或是否对 Alpha 通道以及颜色通道应用卷积滤镜。 | ConvolutionFilter | ||
![]() | prototype : Object [静态]
对类或函数对象的原型对象的引用。 | Object | |
| 方法 | 定义方 | ||
|---|---|---|---|
ConvolutionFilter(matrixX:Number = 0, matrixY:Number = 0, matrix:Array = null, divisor:Number = 1.0, bias:Number = 0.0, preserveAlpha:Boolean = true, clamp:Boolean = true, color:uint = 0, alpha:Number = 0.0) 用指定参数初始化 ConvolutionFilter 实例。 | ConvolutionFilter | ||
返回此滤镜对象的副本。 | ConvolutionFilter | ||
![]() |
指示对象是否已经定义了指定的属性。 | Object | |
![]() |
指示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | |
![]() |
指示指定的属性是否存在、是否可枚举。 | Object | |
![]() |
设置循环操作动态属性的可用性。 | Object | |
![]() |
返回指定对象的字符串表示形式。 | Object | |
![]() |
返回指定对象的原始值。 | Object | |
| alpha | 属性 |
alpha:Number [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
替换颜色的 Alpha 透明度值。有效值为 0 到 1.0。默认值为 0。例如,.25 设置透明度值为 25%。
public function get alpha():Number public function set alpha(value:Number):void| bias | 属性 |
bias:Number [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
要添加到矩阵转换结果中的偏差量。偏差可增加每个通道的颜色值,以便暗色变得较明亮。默认值为 0。
public function get bias():Number public function set bias(value:Number):void| clamp | 属性 |
clamp:Boolean [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
指示是否应锁定图像。对于源图像之外的像素,如果值为 true,则表明通过复制输入图像每个相应的边缘处的颜色值,沿着输入图像的每个边框按需要扩展输入图像。如果值为 false,则表明应按照 color 和 alpha 属性中的指定使用其它颜色。默认值为 true。
public function get clamp():Boolean public function set clamp(value:Boolean):voidBitmapData 类创建两个框,其中一个框的大小是另一个框的一半。在首次加载该示例时,将使用 attachBitmap() 在 mc 内绘制较大的框。在单击 mc 并调用 applyFilter() 方法时,将会在 smallBox 作为源位图的基础上重绘 BitmapData 的 largeBox 实例。由于 applyFilter() 会将 smallBox 绘制在 Rectangle 上,而后者的宽度和高度被指定为 largeBox 的宽度和高度,因此源位图要比绘制区域更小。在本例中,ConvolutionFilter 的 clamp 属性被设置为 false,未被源位图 smallBox 覆盖的区域是由 clampColor 和 clampAlpha 变量确定的纯红色。
package {
import flash.display.Sprite;
import flash.display.BitmapData;
import flash.filters.ConvolutionFilter;
import flash.text.TextField;
import flash.geom.Rectangle;
import flash.geom.Point;
public class ConvolutionClampExample extends Sprite {
// Variables that affect clamping:
var clamp:Boolean = false;
var clampColor:Number = 0xFF0000;
var clampAlpha:Number = 1;
// For illustration, keep other ConvolutionFilter variables neutral:
var bias:Number = 0;
var preserveAlpha:Boolean = false;
// Also, construct a neutral matrix
var matrixCols:Number = 3;
var matrixRows:Number = 3;
var matrix:Array = [ 1,1,1,
1,1,1,
1,1,1 ];
var filter:ConvolutionFilter = new ConvolutionFilter(matrixCols, matrixRows, matrix, matrix.length, bias, preserveAlpha, clamp, clampColor, clampAlpha);
var largeBoxWidth:Number = 100;
var largeBoxHeight:Number = 100;
var largeBox:BitmapData = new BitmapData(largeBoxWidth, largeBoxWidth, true, 0xCC00FF00);
var smallBoxWidth:Number = largeBoxWidth / 2;
var smallBoxHeight:Number = largeBoxHeight / 2;
var smallBox:BitmapData = new BitmapData(smallBoxWidth, smallBoxWidth, true, 0xCC0000FF);
var mc:MovieClip = this.createEmptyMovieClip("mc", this.getNextHighestDepth());
mc.attachBitmap(largeBox, this.getNextHighestDepth());
mc.onPress = function() {
largeBox.applyFilter(smallBox,
new Rectangle(0,0, largeBoxWidth, largeBoxHeight),
new Point(0,0),
filter);
}
}
}| color | 属性 |
color:uint [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
要替换源图像之外的像素的十六进制颜色。它是一个没有 Alpha 成分的 RGB 值。默认值为 0。
public function get color():uint public function set color(value:uint):void| divisor | 属性 |
divisor:Number [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
矩阵转换中使用的除数。默认值为 1。如果除数是所有矩阵值的总和,则可调平结果的总体色彩强度。忽略 0 值,此时使用默认值。
public function get divisor():Number public function set divisor(value:Number):void| matrix | 属性 |
matrix:Array [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
用于矩阵转换的值的数组。数组中的项数必须等于 matrixX * matrixY。
矩阵盘绕基于一个 n x m 矩阵,该矩阵说明输入图像中的给定像素值如何与其相邻的像素值合并以生成最终的像素值。每个结果像素通过将矩阵应用到相应的源像素及其相邻像素来确定。
对于 3 x 3 矩阵卷积,将以下公式用于每个独立的颜色通道:
dst (x, y) = ((src (x-1, y-1) * a0 + src(x, y-1) * a1....
src(x, y+1) * a7 + src (x+1,y+1) * a8) / divisor) + bias
某些规格的滤镜在由提供 SSE(SIMD 流扩展)的处理器运行时执行速度更快。以下是更快的卷积操作的条件:
注意:如果使用不带参数的构造函数创建了 ConvolutionFilter 实例,则为矩阵属性赋值的顺序将影响滤镜的行为。在以下情况中,矩阵数组已指定,而 matrixX 和 matrixY 属性仍设置为 0(默认值):
public var myfilter:ConvolutionFilter = new ConvolutionFilter();
myfilter.matrix = [0, 0, 0, 0, 1, 0, 0, 0, 0];
myfilter.matrixX = 3;
myfilter.matrixY = 3;
在以下情况中,矩阵数组已指定,而 matrixX 和 matrixY 属性设置为 3:
public var myfilter:ConvolutionFilter = new ConvolutionFilter();
myfilter.matrixX = 3;
myfilter.matrixY = 3;
myfilter.matrix = [0, 0, 0, 0, 1, 0, 0, 0, 0]; public function get matrix():Array public function set matrix(value:Array):voidTypeError — 设置时 Array 为 null |
| matrixX | 属性 |
matrixX:Number [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
矩阵的 x 维度(矩阵中列的数目)。默认值为 0。
public function get matrixX():Number public function set matrixX(value:Number):void| matrixY | 属性 |
matrixY:Number [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
矩阵的 y 维度(矩阵中行的数目)。默认值为 0。
public function get matrixY():Number public function set matrixY(value:Number):void| preserveAlpha | 属性 |
preserveAlpha:Boolean [读写] | 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
指示是否已保留 Alpha 通道并且不使用滤镜效果,或是否对 Alpha 通道以及颜色通道应用卷积滤镜。值为 false 表示卷积应用于所有通道,包括 Alpha 通道。值为 true 表示只对颜色通道应用卷积。默认值为 true。
public function get preserveAlpha():Boolean public function set preserveAlpha(value:Boolean):void| ConvolutionFilter | () | 构造函数 |
public function ConvolutionFilter(matrixX:Number = 0, matrixY:Number = 0, matrix:Array = null, divisor:Number = 1.0, bias:Number = 0.0, preserveAlpha:Boolean = true, clamp:Boolean = true, color:uint = 0, alpha:Number = 0.0)| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
用指定参数初始化 ConvolutionFilter 实例。
参数matrixX:Number (default = 0) —
矩阵的 x 维度(矩阵中列的数目)。默认值为 0。
| |
matrixY:Number (default = 0) —
矩阵的 y 维度(矩阵中行的数目)。默认值为 0。
| |
matrix:Array (default = null) —
用于矩阵转换的值的数组。数组中的项数必须等于 matrixX * matrixY。
| |
divisor:Number (default = 1.0) — 矩阵转换中使用的除数。默认值为 1。如果除数是所有矩阵值的总和,则可调平结果的总体色彩强度。忽略 0 值,此时使用默认值。 | |
bias:Number (default = 0.0) — 要添加到矩阵转换结果的偏差。默认值为 0。 | |
preserveAlpha:Boolean (default = true) —
false 值表示未保留 Alpha 值,并且卷积适用于所有通道(包括 Alpha 通道)。值为 true 表示只对颜色通道应用卷积。默认值为 true。
| |
clamp:Boolean (default = true) —
对于源图像之外的像素,如果值为 true,则表明通过复制输入图像给定边缘处的颜色值,沿着输入图像的每个边框按需要扩展输入图像。如果值为 false,则表明应按照 color 和 alpha 属性中的指定使用其它颜色。默认值为 true。
| |
color:uint (default = 0) — 要替换源图像之外的像素的十六进制颜色。 | |
alpha:Number (default = 0.0) — 替换颜色的 Alpha。 |
| clone | () | 方法 |
override public function clone():BitmapFilter| 语言版本: | ActionScript 3.0 |
| 运行时版本: | AIR 1.0 Flash Player 9 |
返回此滤镜对象的副本。
返回BitmapFilter — BitmapFilter,与原始 ConvolutionMatrixFilter 实例具有完全相同的属性的新 ConvolutionFilter 实例。 |
buildChild() 四次,以加载和显示图像的四个实例。对 buildChild() 的每次调用都将函数作为参数,该函数不对第一个实例应用任何滤镜,而对后续的每个实例应用不同的卷积滤镜。
buildChild() 函数创建一个名为 loader 的新 Loader 对象。每次调用 buildChild() 时,将一个事件侦听器附加到 Loader 对象,以侦听 complete 事件,这些事件由传递给 buildChild() 的函数处理。
applyBrightness()、applySharpness() 和 applyOutline() 函数使用 matrix 数组的不同值来实现不同的 ConvolutionFilter 效果。
注意:为获得最佳效果,请使用宽度约为 80 像素的图像。图像文件的名称和位置应与您传递给 url 属性的值相匹配。例如,此示例中传递给 url 的值指向名为“Image.jpg”的图像文件,该图像文件与 SWF 文件位于同一目录中。
package {
import flash.display.DisplayObject;
import flash.display.Loader;
import flash.display.Sprite;
import flash.events.*;
import flash.filters.BitmapFilter;
import flash.filters.ConvolutionFilter;
import flash.net.URLRequest;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
public class ConvolutionFilterExample extends Sprite {
private var size:uint = 140;
private var url:String = "Image.jpg";
public function ConvolutionFilterExample() {
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);
}
}
}