ColorMatrix使用

 

  
  
  
  
  1. /**  
  2. * ColorMatrix by Grant Skinner. August 8, 2005  
  3. * Updated to AS3 November 19, 2007  
  4. **/ 
  5.  
  6. package com.gskinner.geom {  
  7.  
  8.     dynamic public class ColorMatrix extends Array {  
  9.       
  10.     // constant for contrast calculations:  
  11.         private static const DELTA_INDEX:Array = [  
  12.             0,    0.010.020.040.050.060.070.080.1,  0.11,  
  13.             0.120.140.150.160.170.180.200.210.220.24,  
  14.             0.250.270.280.300.320.340.360.380.400.42,  
  15.             0.440.460.480.5,  0.530.560.590.620.650.68,   
  16.             0.710.740.770.800.830.860.890.920.950.98,  
  17.             1.0,  1.061.121.181.241.301.361.421.481.54,  
  18.             1.601.661.721.781.841.901.962.0,  2.122.25,   
  19.             2.372.502.622.752.873.0,  3.2,  3.4,  3.6,  3.8,  
  20.             4.0,  4.3,  4.7,  4.9,  5.0,  5.5,  6.0,  6.5,  6.8,  7.0,  
  21.             7.3,  7.5,  7.8,  8.0,  8.4,  8.7,  9.0,  9.4,  9.6,  9.8,   
  22.             10.0 
  23.         ];  
  24.       
  25.         // identity matrix constant:  
  26.         private static const IDENTITY_MATRIX:Array = [  
  27.             1,0,0,0,0,  
  28.             0,1,0,0,0,  
  29.             0,0,1,0,0,  
  30.             0,0,0,1,0,  
  31.             0,0,0,0,1 
  32.         ];  
  33.         private static const LENGTH:Number = IDENTITY_MATRIX.length;  
  34.       
  35.       
  36.     // initialization:  
  37.         public function ColorMatrix(matrix:Array=null) {  
  38.             matrix = fixMatrix(matrix);  
  39.             copyMatrix(((matrix.length == LENGTH) ? matrix : IDENTITY_MATRIX));  
  40.         }  
  41.           
  42.           
  43.     // public methods:  
  44.         public function reset():void {  
  45.             for (var i:uint=0; i<LENGTH; i++) {  
  46.                 this[i] = IDENTITY_MATRIX[i];  
  47.             }  
  48.         }  
  49.       
  50.         public function adjustColor(brightness:Number,contrast:Number,saturation:Number,hue:Number):void {  
  51.             adjustHue(hue);  
  52.             adjustContrast(contrast);  
  53.             adjustBrightness(brightness);  
  54.             adjustSaturation(saturation);  
  55.         }  
  56.  
  57.         public function adjustBrightness(value:Number):void {  
  58.             value = cleanValue(value,255);  
  59.             if (value == 0 || isNaN(value)) { return; }  
  60.             multiplyMatrix([  
  61.                 1,0,0,0,value,  
  62.                 0,1,0,0,value,  
  63.                 0,0,1,0,value,  
  64.                 0,0,0,1,0,  
  65.                 0,0,0,0,1 
  66.             ]);  
  67.         }  
  68.       
  69.         public function adjustContrast(value:Number):void {  
  70.             value = cleanValue(value,100);  
  71.             if (value == 0 || isNaN(value)) { return; }  
  72.             var x:Number;  
  73.             if (value<0) {  
  74.                 x = 127+value/100*127 
  75.             } else {  
  76.                 x = value%1;  
  77.                 if (x == 0) {  
  78.                     x = DELTA_INDEX[value];  
  79.                 } else {  
  80.                     //x = DELTA_INDEX[(value<<0)]; // this is how the IDE does it.  
  81.                     x = DELTA_INDEX[(value<<0)]*(1-x)+DELTA_INDEX[(value<<0)+1]*x; // use linear interpolation for more granularity.  
  82.                 }  
  83.                 x = x*127+127;  
  84.             }  
  85.             multiplyMatrix([  
  86.                 x/127,0,0,0,0.5*(127-x),  
  87.                 0,x/127,0,0,0.5*(127-x),  
  88.                 0,0,x/127,0,0.5*(127-x),  
  89.                 0,0,0,1,0,  
  90.                 0,0,0,0,1 
  91.             ]);  
  92.         }  
  93.       
  94.         public function adjustSaturation(value:Number):void {  
  95.             value = cleanValue(value,100);  
  96.             if (value == 0 || isNaN(value)) { return; }  
  97.             var x:Number = 1+((value > 0) ? 3*value/100 : value/100);  
  98.             var lumR:Number = 0.3086;  
  99.             var lumG:Number = 0.6094;  
  100.             var lumB:Number = 0.0820;  
  101.             multiplyMatrix([  
  102.                 lumR*(1-x)+x,lumG*(1-x),lumB*(1-x),0,0,  
  103.                 lumR*(1-x),lumG*(1-x)+x,lumB*(1-x),0,0,  
  104.                 lumR*(1-x),lumG*(1-x),lumB*(1-x)+x,0,0,  
  105.                 0,0,0,1,0,  
  106.                 0,0,0,0,1 
  107.             ]);  
  108.         }  
  109.       
  110.         public function adjustHue(value:Number):void {  
  111.             value = cleanValue(value,180)/180*Math.PI;  
  112.             if (value == 0 || isNaN(value)) { return; }  
  113.             var cosVal:Number = Math.cos(value);  
  114.             var sinVal:Number = Math.sin(value);  
  115.             var lumR:Number = 0.213;  
  116.             var lumG:Number = 0.715;  
  117.             var lumB:Number = 0.072;  
  118.             multiplyMatrix([  
  119.                 lumR+cosVal*(1-lumR)+sinVal*(-lumR),lumG+cosVal*(-lumG)+sinVal*(-lumG),lumB+cosVal*(-lumB)+sinVal*(1-lumB),0,0,  
  120.                 lumR+cosVal*(-lumR)+sinVal*(0.143),lumG+cosVal*(1-lumG)+sinVal*(0.140),lumB+cosVal*(-lumB)+sinVal*(-0.283),0,0,  
  121.                 lumR+cosVal*(-lumR)+sinVal*(-(1-lumR)),lumG+cosVal*(-lumG)+sinVal*(lumG),lumB+cosVal*(1-lumB)+sinVal*(lumB),0,0,  
  122.                 0,0,0,1,0,  
  123.                 0,0,0,0,1 
  124.             ]);  
  125.         }  
  126.       
  127.         public function concat(matrix:Array):void {  
  128.             matrix = fixMatrix(matrix);  
  129.             if (matrix.length != LENGTH) { return; }  
  130.             multiplyMatrix(matrix);  
  131.         }  
  132.           
  133.         public function clone():ColorMatrix {  
  134.             return new ColorMatrix(this);  
  135.         }  
  136.       
  137.         public function toString():String {  
  138.             return "ColorMatrix [ "+this.join(" , ")+" ]";  
  139.         }  
  140.           
  141.         // return a length 20 array (5x4):  
  142.         public function toArray():Array {  
  143.             return slice(0,20);  
  144.         }  
  145.       
  146.     // private methods:  
  147.         // copy the specified matrix's values to this matrix:  
  148.         protected function copyMatrix(matrix:Array):void {  
  149.             var l:Number = LENGTH;  
  150.             for (var i:uint=0;i<l;i++) {  
  151.                 this[i] = matrix[i];  
  152.             }  
  153.         }  
  154.       
  155.         // multiplies one matrix against another:  
  156.         protected function multiplyMatrix(matrix:Array):void {  
  157.             var col:Array = [];  
  158.               
  159.             for (var i:uint=0;i<5;i++) {  
  160.                 for (var j:uint=0;j<5;j++) {  
  161.                     col[j] = this[j+i*5];  
  162.                 }  
  163.                 for (j=0;j<5;j++) {  
  164.                     var val:Number=0;  
  165.                     for (var k:Number=0;k<5;k++) {  
  166.                         val += matrix[j+k*5]*col[k];  
  167.                     }  
  168.                     this[j+i*5] = val;  
  169.                 }  
  170.             }  
  171.         }  
  172.           
  173.         // make sure values are within the specified range, hue has a limit of 180, others are 100:  
  174.         protected function cleanValue(value:Number,limit:Number):Number {  
  175.             return Math.min(limit,Math.max(-limit,value));  
  176.         }  
  177.       
  178.         // makes sure matrixes are 5x5 (25 long):  
  179.         protected function fixMatrix(matrix:Array=null):Array {  
  180.             if (matrix == null) { return IDENTITY_MATRIX; }  
  181.             if (matrix is ColorMatrix) { matrix = matrix.slice(0); }  
  182.             if (matrix.length < LENGTH) {  
  183.                 matrix = matrix.slice(0,matrix.length).concat(IDENTITY_MATRIX.slice(matrix.length,LENGTH));  
  184.             } else if (matrix.length > LENGTH) {  
  185.                 matrix = matrix.slice(0,LENGTH);  
  186.             }  
  187.             return matrix;  
  188.         }  
  189.     }  

look

你可能感兴趣的:(ColorMatrix)