1. 程式人生 > >ColorMatrixFilter色彩矩陣濾鏡(as3)

ColorMatrixFilter色彩矩陣濾鏡(as3)

matrix是一個長度為4*5=20的陣列,其構成如下所示: R  ,G,  B,  A, offset
[1,  0,  0,  0,  0]); // red
[0,  1,  0,  0,  0]); // green
[0,  0,  1,  0,  0]); // blue
[0,  0,  0,  1,  0]); // alpha

  上面是matrix的初始狀態。
  下面我分先來分析一下其初始狀態。
  red通道的值:(1,0,0,0,0)表示,R通道的乘數是1(完全保留),別的道道的的乘數是0,(不加入別的通道的顏色),色彩偏移量off是0;
  別的通道依次類推。
  下面來做一些效果,增加對colorMatrixFilter的認識:1、調整亮度:
  亮度(N取值為-255到255)1,0,0,0,N
0,1,0,0,N
0,0,1,0,N
0,0,0,1,0

  我們只需要設定一下RGB的色彩偏移就能調節其亮度,是不是很簡單呢。2、顏色反向-1,0,0,0,255
0,-1,0,0,255
0,0,-1,0,255
0,0,0,1,0

  先解釋一下顏色反向:就是把0變為255,255變為0,1變為254,254變為1…..
  因此,我們只需把RGB通道的原通道乘數設為-1,然後再把色彩偏移量設為255就行了。3、影象去色:0.3086, 0.6094, 0.0820, 0, 0
0.3086, 0.6094, 0.0820, 0, 0
0.3086, 0.6094, 0.0820, 0, 0
0    , 0    , 0    , 1, 0

  1)、首先了解一下去色原理:只要把RGB三通道的色彩資訊設定成一樣;即:R=G=B,那麼影象就變成了灰色,並且,為了保證影象亮度不變,同一個通道中的R+G+B=1:如:0.3086+0.6094+0.0820=1;
  2)、三個數字的由來:0.3086, 0.6094, 0.0820;
  按理說應該把RGB平分,都是0.3333333。三個數字應該是根據色彩光波頻率及色彩心理學計算出來的(本人是這麼認為,當然也查詢了一些資料,目前尚未找到準確答案。
  在作用於人眼的光線中,彩色光要明顯強於無色光。對一個影象按RGB平分理論給影象去色的話,人眼就會明顯感覺到影象變暗了(當然可能有心理上的原因,也有光波的科學依據)另外,在彩色影象中能識別的一下細節也可能會丟失。我假想:可能綠色的一些東西會丟失。
  下面是我從PS中對RGB都為255的明度對比圖:
  
  同樣的RGB,給人的感覺是綠色最亮,紅色次之,藍色最暗。它們的比例大概是3:6:1,即:0.3086, 0.6094, 0.0820
  所以,在給影象去色時我們保留了大量的G通道資訊,使得影象不至於變暗或者綠色資訊不至於丟失(我猜想)。4、色彩飽和度
  N取值為0到2,當然也可以更高。0.3086*(1-N) + N, 0.6094*(1-N)    , 0.0820*(1-N)    , 0, 0,
0.3086*(1-N)   , 0.6094*(1-N) + N, 0.0820*(1-N)    , 0, 0,
0.3086*(1-N)   , 0.6094*(1-N)    , 0.0820*(1-N) + N 0, 0,
0        , 0        , 0        , 1, 0

  分析:
當色彩飽和度低到一定成度的時候,就想當於給影象去色,所以跟第3條:影象去色,有著千絲萬縷的聯絡,在此不想過多解釋; 
N為原有通道資訊保留量;可以理解為百分之幾,等於0時完全去色,小於1時降低色度,大於1時增加色度,等於2時色度翻一倍,等於3時……。注意:RGB的原有通道資訊保留量都應該相等,不然會產生偏色。
為什麼是這樣的計算公式: 
  N是原通道色彩保留量:所以,在原通道中,我們都+ N,這是不能被別的通道瓜分的。剩餘的就是(1-N),就讓RGB按0.3086, 0.6094, 0.0820的比例還瓜分這個剩餘量吧。5、對比度
  N取值為0到10N,0,0,0,128*(1-N)
0,N,0,0,128*(1-N)
0,0,N,0,128*(1-N)
0,0,0,1,0

  分析:
  所謂對比度就是讓紅的更紅,綠的更綠……或反之。初一想,我們只需要修改RGB的乘數(要一至,不然偏色)。可仔細一琢磨,不對。如果只增加乘數,那麼整個影象就會被漂白,(或反之)。好,有辦法了,設定色彩偏移量,offset。具體要偏移多少呢,我們找到了一個折中的方案:128(1-N);即:一幅影象,不論很亮或很黑,但對比度為0了,最終得到的都是一幅中性灰度的影象(128),6、閾值
  所謂閾值,就是以一個色度值為基準對影象作非黑即白的處理(注意沒有灰色),由於不去除了彩色屬性,因此,也離不開0.3086, 0.6094, 0.0820這三組神奇的數字。
  (N取值為0到255)
  下面的256也可以改成255;(那樣就能看到圖一和圖五的小黑點和小白點);0.3086*256,0.6094*256,0.0820*256,0,-256*N
0.3086*256,0.6094*256,0.0820*256,0,-256*N
0.3086*256,0.6094*256,0.0820*256,0,-256*N
0, 0, 0, 1, 0

  分析:
  先不看最後面的色彩偏移:-256*N
  前面我們提及過,當RGB三個通道的色彩資訊一模一樣時,影象就失去了色彩(去色),從0.3086256,0.6094256,0.0820256,0,-256N可以看出:影象已經去色了,並且,(*256)亮度已經翻了256倍(當然也可以是255);我們知道,RGB的有效值是0-255,即:0,1,2……255,把這些值乘以255以後會出現什麼情況呢?但是除了0之外,別的全都大於或等於255了,所以此時的影象除了剩有幾個黑點外,其它的全都變成白色瞭如圖一(N=0);那麼現在我們再作色彩偏移處理:把RGB都減去255;上次值為255(白色)的現在又變成0(黑色了)超過255的仍然是白色,我們不斷的反覆減255,圖2,圖3,圖4,圖5,分別是N=64,N=128,n=192,n=255時的影象:
  7、色彩旋轉請大家關注盛世遊戲:
  所謂色彩旋轉就是讓某一個通道的色彩資訊讓另一個通道去顯示;比如,R顯示G的資訊,G顯示B的資訊,B顯示R的資訊,也可以只拿出一部份資訊讓給別的通道去顯示,至於引數的瓜分可以平分。不必太講究,但是,始終要堅持的一個原則就是每一個通道中的RGB資訊量之和一定要為1,不然將會生偏色,如果您要製作偏色效果又另當別論;請償試下面的引數:0,1,0,0,0
0,0,1,0,0
1,0,0,0,0
0,0,0,1,0

  //—————0,0,1,0,0
1,0,0,0,0
0,1,0,0,0
0,0,0,1,0
8、只顯示某個通道;1,0,0,0,0
0,0,0,0,0
0,0,0,0,0
0,0,0,1,0

  上面是隻顯示紅色通道。依次類推。