首页 > 代码库 > ActionScript3游戏中的图像编程(连载七十六)

ActionScript3游戏中的图像编程(连载七十六)

总目录:http://blog.csdn.net/iloveas2014/article/details/38304477

 

4.3.3 ColorMatrixFilter与ColorTransform在底层处理机制上的差异

      代码中最最关键的地方就在于红色标注的一句——设置一个ColorMatrixFilter。注意到matrix是一个数组,只是为了便于用矩阵的形式查看,我们一般都把它分成4行来写。上面的代码中,我用单位矩阵进行填充,所以输出结果与源图像一致。


      下面,我们尝试用ColorMatrixFilter进行反色。


      ColorTransform的反色代码如下:


 

_myColorTransform.redMultiplier = _myColorTransform.greenMultiplier =_myColorTransform.blueMultiplier = -1;_myColorTransform.redOffset = 255 = _myColorTransform.greenOffset = _myColorTransform.blueOffset = 255;



      把它代入到ColorMatrixFilter的Transform矩阵中,得到:

 

     


 
      前面提到,ColorTransform在使用了BlendMode之后会出错,那么,改用ColorMatrixFilter之后的结果又会如何呢?我们改一下代码:


 

_testSprite_dst.filters = [new ColorMatrixFilter([-1, 0, 0, 0, 255,                                                  0, -1, 0, 0, 255,                                                  0, 0, -1, 0, 255,                                                  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的矩阵中。

 


 

ActionScript3游戏中的图像编程(连载七十六)