包 | flash.filters |
类 | public final class ColorMatrixFilter |
继承 | ColorMatrixFilter BitmapFilter Object |
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9 |
注意:对于 RGBA 值,最高有效字节代表红色通道值,其后的有效字节分别代表绿色、蓝色和 Alpha 通道值。
要创建新的颜色矩阵滤镜,请使用 new ColorMatrixFilter()
语法。滤镜的具体使用取决于要应用滤镜的对象:
- 要对影片剪辑、文本字段、按钮和视频应用滤镜,请使用
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 像素。例如,如果在放大某大型影片剪辑时应用了滤镜,则所得图像达到最大尺寸时,将关闭该滤镜。
相关 API 元素
flash.display.BitmapData.applyFilter()
flash.display.DisplayObject.filters
flash.display.DisplayObject.cacheAsBitmap
属性 | 由以下参数定义 | ||
---|---|---|---|
constructor : Object
对类对象或给定对象实例的构造函数的引用。 | Object | ||
matrix : Array
由 20 个项目组成的数组,适用于 4 x 5 颜色转换。 | ColorMatrixFilter |
方法 | 由以下参数定义 | ||
---|---|---|---|
ColorMatrixFilter(matrix:Array = null)
用指定参数初始化新的 ColorMatrixFilter 实例。 | ColorMatrixFilter | ||
[覆盖]
返回此滤镜对象的副本。 | ColorMatrixFilter | ||
表示对象是否已经定义了指定的属性。 | Object | ||
表示 Object 类的实例是否在指定为参数的对象的原型链中。 | Object | ||
表示指定的属性是否存在、是否可枚举。 | Object | ||
设置循环操作动态属性的可用性。 | Object | ||
返回此对象的字符串表示形式,其格式设置遵守区域设置特定的约定。 | Object | ||
返回指定对象的字符串表示形式。 | Object | ||
返回指定对象的原始值。 | 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 | () | 构造函数 |
clone | () | 方法 |
override public function clone():BitmapFilter
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9 |
返回此滤镜对象的副本。
返回BitmapFilter — 与原始实例具有完全相同的属性的新 ColorMatrixFilter 实例。
|
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); } } }
Tue Jun 12 2018, 11:04 AM Z