总目录:http://blog.csdn.net/iloveas2014/article/details/38304477
4.4.5 AdjustColor合并4个矩阵
单个属性的算法我们就先探讨到这了,下面我们重点看一下矩阵的合并部分。
首先可以看到有5个矩阵类型的变量:
private var m_brightnessMatrix:ColorMatrix;
private var m_contrastMatrix:ColorMatrix;
private var m_saturationMatrix:ColorMatrix;
private var m_hueMatrix:ColorMatrix;
private var m_finalMatrix:ColorMatrix;
前4个分别对应AdjustColor的4个属性,而m_finalMatrix自然就是以上4个矩阵合并的结果了,我们看一下实际应用中比较常用的那个方法:CalculateFinalFlatArray。
if(CalculateFinalMatrix()){
return m_finalMatrix.GetFlatArray();
}
return null;
首先,该方法会执行CalculateFinalMatrix函数计算最终矩阵,然后调用ColorMatrix的GetFlatArray函数得到一个长度为20的矩阵供ColorMatrixFilter使用。所以,接下来的关键就在于CalculateFinalMatrix方法。从源码可知,它就是用矩阵乘法把4个矩阵合并到m_finalMatrix中,执行顺序为亮度,对比度,饱和度和色相,与Flash IDE中的排列顺序完全一致。
关于AdjustColor类,最后我想提的一点是,在CalculateFinalMatrix计算前,函数先执行了一个if,判断4个矩阵是否非空。因此我们在使用AdjustColor时,必须对4个属性都至少设置一次才能让矩阵正常输出。
实际上Adobe完全没有必要这么做,因为Adobe已经在DynamicMatrix的操作里对空矩阵进行了判断,所以AdjustColor在计算前多判断一次实在有点多此一举了。再者,不在AdjustColor里做空矩阵判断还简化了AdjustColor使用者的调用流程,Adobe加来又何苦呢?
此外,我们还可以给AdjustColor的构造函数定义brightness,contrast,saturation和hue这4个参数,以减少外部调用的代码量:
public function AdjustColor(brightness:Number = 0, contrast:Numer = 0, saturation:Number = 0, hue:Number = 0){
this.brightness = brightness;
this.contrast = contrast;
this.saturation = saturation;
this.hue = hue;
}
AdjustColor类还有很多可以完善的地方,此处就不再一一列举了。