总目录:http://www.cnblogs.com/iloveas/p/3879125.html
4.3.3 ColorMatrixFilter与ColorTransform在底层处理机制上的差异
代码中最最关键的地方就在于红色标注的一句——设置一个ColorMatrixFilter。注意到matrix是一个数组,只是为了便于用矩阵的形式查看,我们一般都把它分成4行来写。上面的代码中,我用单位矩阵进行填充,所以输出结果与源图像一致。
下面,我们尝试用ColorMatrixFilter进行反色。
ColorTransform的反色代码如下:
1 _myColorTransform.redMultiplier = _myColorTransform.greenMultiplier =_myColorTransform.blueMultiplier = -1; 2 _myColorTransform.redOffset = 255 = _myColorTransform.greenOffset = _myColorTransform.blueOffset = 255;
把它代入到ColorMatrixFilter的Transform矩阵中,得到:
前面提到,ColorTransform在使用了BlendMode之后会出错,那么,改用ColorMatrixFilter之后的结果又会如何呢?我们改一下代码:
1 _testSprite_dst.filters = [new ColorMatrixFilter([-1, 0, 0, 0, 255, 2 0, -1, 0, 0, 255, 3 0, 0, -1, 0, 255, 4 0, 0, 0, 1, 0])];
效果如图 4.23所示。
图 4.23 ColorMatrixFilter的反色
可以发现,ColorMatrixFilter并没有出现ColorTransform的那种错误,反色效果相当准确,究其原因,就在于ColorTransform的处理基于矢量,单个圆反色后再ADD的结果并不等于ADD后再整体反色。但是ColorMatrixFilter作为BitmapFilter的子类,它不管源对象是矢量还是位图都会把它按照位图的方式进行处理,反色的优先级低于内部的混合模式,所以不会出错。
另一个可以证明该结论的例子,是透明度的设置,如图 4.24和图 4.25所示。
图 4.24 ColorTransform设置透明度
图 4.25 ColorMatrixFilter的透明度
此外,受矢量和位图处理模式差异的影响,给没有设置cacheAsBitmap(包括滤镜)的设备字体应用alphaMultiplier将没有任何效果,但是ColorMatrixFilter的alpha则可以让设备字体透明。这一点相信大家都比较熟悉,此处不再赘述。
关于可以用ColorTransform实现的颜色矩阵,我不打算继续展开讨论,因为我已经在ColorTransform一节里面分析得够详细了。在ColorMatrixFilter里要做的,仅仅是把数值代入到Transform的矩阵中。