flash.filters
public final class ColorMatrixFilter
继承ColorMatrixFilter Inheritance BitmapFilter Inheritance Object

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

使用 ColorMatrixFilter 类可以将 4 x 5 矩阵转换应用于输入图像上的每个像素的 RGBA 颜色和 Alpha 值,以生成具有一组新的 RGBA 颜色和 Alpha 值的结果。该类允许饱和度更改、色相旋转、亮度为 Alpha 以及各种其它效果。您可以将滤镜应用于任何显示对象(即,从 DisplayObject 类继承的对象),例如 MovieClip、SimpleButton、TextField 和 Video 对象,以及 BitmapData 对象。

注意:对于 RGBA 值,最高有效字节代表红色通道值,其后的有效字节分别代表绿色、蓝色和 Alpha 通道值。

若要创建新的颜色矩阵滤镜,请使用 new ColorMatrixFilter() 语法。滤镜的具体使用取决于要应用滤镜的对象:

如果对显示对象应用滤镜,显示对象的 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 像素。 例如,如果在放大某大型影片剪辑时应用了滤镜,则所得图像达到最大尺寸时,将关闭该滤镜。

查看示例

另请参见

flash.display.BitmapData.getPixel()
flash.display.BitmapData.applyFilter()
flash.display.DisplayObject.filters
flash.display.DisplayObject.cacheAsBitmap
Using filters in Flex


公共属性
 属性定义方
 Inheritedconstructor : Object
对类对象或给定对象实例的构造函数的引用。
Object
  matrix : Array
由 20 个项目组成的数组,适用于 4 x 5 颜色转换。
ColorMatrixFilter
 Inheritedprototype : Object
[静态] 对类或函数对象的原型对象的引用。
Object
公共方法
 方法定义方
  
ColorMatrixFilter(matrix:Array = null)
用指定参数初始化新的 ColorMatrixFilter 实例。
ColorMatrixFilter
  
返回此滤镜对象的副本。
ColorMatrixFilter
 Inherited
指示对象是否已经定义了指定的属性。
Object
 Inherited
指示 Object 类的实例是否在指定为参数的对象的原型链中。
Object
 Inherited
指示指定的属性是否存在、是否可枚举。
Object
 Inherited
设置循环操作动态属性的可用性。
Object
 Inherited
返回指定对象的字符串表示形式。
Object
 Inherited
返回指定对象的原始值。
Object
属性详细信息
matrix属性
matrix:Array  [读写]

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

由 20 个项目组成的数组,适用于 4 x 5 颜色转换。matrix 属性不能通过直接修改它的值来更改(例如 myFilter.matrix[2] = 1;)。相反,必须先获取对数组的引用,对引用进行更改,然后重置该值。

颜色矩阵滤镜将每个源像素分离成它的红色、绿色、蓝色和 Alpha 成分,分别以 srcR、srcG、srcB 和 srcA 表示。若要计算四个通道中每个通道的结果,可将图像中每个像素的值乘以转换矩阵中的值。(可选)可以将偏移量(介于 -255 至 255 之间)添加到每个结果(矩阵的每行中的第五项)中。滤镜将各颜色成分重新组合为单一像素,并写出结果。在下列公式中,a[0] 到 a[19] 对应于由 20 个项目组成的数组中的条目 0 至 19,该数组已传递到 matrix 属性:

redResult   = (a[0]  * srcR) + (a[1]  * srcG) + (a[2]  * srcB) + (a[3]  * srcA) + a[4]
 greenResult = (a[5]  * srcR) + (a[6]  * srcG) + (a[7]  * srcB) + (a[8]  * srcA) + a[9]
 blueResult  = (a[10] * srcR) + (a[11] * srcG) + (a[12] * srcB) + (a[13] * srcA) + a[14]
 alphaResult = (a[15] * srcR) + (a[16] * srcG) + (a[17] * srcB) + (a[18] * srcA) + a[19]

对于数组中的每个颜色值,值 1 等于正发送到输出的通道的 100%,同时保留颜色通道的值。

计算是对非相乘的颜色值执行的。如果输入图形由预先相乘的颜色值组成,这些值会自动转换为非相乘的颜色值以执行此操作。

可使用两种经过优化的模式:

仅 Alpha。当向滤镜传递仅调整 Alpha 成分的矩阵时,滤镜将优化其性能,如下所示:

1 0 0 0 0
     0 1 0 0 0
     0 0 1 0 0
     0 0 0 N 0  (where N is between 0.0 and 1.0)

更快的版本。仅可用于启用 SSE/AltiVec 加速器的处理器,如 Intel® Pentium® 3 及更高版本、Apple® G4 及更高版本。当乘数项在 -15.99 到 15.99 之间,并且加数项 a[4]、a[9]、a[14] 和 a[19] 在 -8000 到 8000 之间时,将使用加速器。



实现
    public function get matrix():Array
    public function set matrix(value:Array):void

引发
TypeError — 设置时 Array 为 null
构造函数详细信息
ColorMatrixFilter()构造函数
public function ColorMatrixFilter(matrix:Array = null)

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

用指定参数初始化新的 ColorMatrixFilter 实例。

参数
matrix:Array (default = null) — 由 20 个项目(排列成 4 x 5 矩阵)组成的数组。
方法详细信息
clone()方法
override public function clone():BitmapFilter

语言版本: ActionScript 3.0
运行时版本: AIR 1.0 Flash Player 9

返回此滤镜对象的副本。

返回
BitmapFilter — 与原始实例具有完全相同的属性的新 ColorMatrixFilter 实例。
示例 如何使用示例
ColorMatrixFilterExample.as

以下示例将不同的颜色矩阵滤镜应用于图像文件。滤镜构造函数调用 buildChild() 四次,以加载和显示图像的四个实例。对 buildChild() 的第一次调用将 null 作为参数,不将滤镜应用于第一个实例。对 buildChild() 的每次后续调用都将函数作为参数,该函数将不同的颜色矩阵滤镜应用于图像的每个后续实例。

buildChild() 函数创建一个名为 loader 的新 Loader 对象。每次调用 buildChild() 时,将一个事件侦听器附加到 Loader 对象,以侦听 complete 事件,这些事件由传递给 buildChild() 的函数处理。

applyRed()applyGreen()applyBlue() 函数使用 matrix 数组的不同值来实现不同的效果。

注意:为获得最佳效果,请使用宽度约为 80 像素的图像。图像文件的名称和位置应与您传递给 url 属性的值相匹配。例如,此示例中传递给 url 的值指向名为“Image.jpg”的图像文件,该图像文件与 SWF 文件位于同一目录中。

package {
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.events.IOErrorEvent;
    import flash.filters.ColorMatrixFilter;
    import flash.net.URLRequest;

    public class ColorMatrixFilterExample extends Sprite {
        private var size:uint  = 140;
        private var url:String = "Image.jpg";

        public function ColorMatrixFilterExample() {
            buildChild(null);
            buildChild(applyRed);
            buildChild(applyGreen);
            buildChild(applyBlue);
        }

        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 applyRed(event:Event):void {
            var child:DisplayObject = DisplayObject(event.target.loader);
            var matrix:Array = new Array();
            matrix = matrix.concat([1, 0, 0, 0, 0]); // red
            matrix = matrix.concat([0, 0, 0, 0, 0]); // green
            matrix = matrix.concat([0, 0, 0, 0, 0]); // blue
            matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha

            applyFilter(child, matrix);
        }

        private function applyGreen(event:Event):void {
            var child:DisplayObject = DisplayObject(event.target.loader);
            var matrix:Array = new Array();
            matrix = matrix.concat([0, 0, 0, 0, 0]); // red
            matrix = matrix.concat([0, 1, 0, 0, 0]); // green
            matrix = matrix.concat([0, 0, 0, 0, 0]); // blue
            matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha

            applyFilter(child, matrix);
        }

        private function applyBlue(event:Event):void {
            var child:DisplayObject = DisplayObject(event.target.loader);
            var matrix:Array = new Array();
            matrix = matrix.concat([0, 0, 0, 0, 0]); // red
            matrix = matrix.concat([0, 0, 0, 0, 0]); // green
            matrix = matrix.concat([0, 0, 1, 0, 0]); // blue
            matrix = matrix.concat([0, 0, 0, 1, 0]); // alpha

            applyFilter(child, matrix);
        }

        private function applyFilter(child:DisplayObject, matrix:Array):void {
            var filter:ColorMatrixFilter = new ColorMatrixFilter(matrix);
            var filters:Array = new Array();
            filters.push(filter);
            child.filters = filters;
        }
        
        private function ioErrorHandler(event:IOErrorEvent):void {
            trace("Unable to load image: " + url);
        }
    }
}