·您当前的位置:首页 > 技术教程 > AS2与AS3技术 >

[AS3]as3色彩滤镜ColorMatrix实现饱和度/色调/对比度/亮度的调整

时间:2014-03-21 10:03cuplayer.com
[AS3]as3滤镜ColorMatrix实现饱和度/色调/对比度/亮度的调整源代码,as3滤镜,as3色彩滤镜,as3饱和度,as3对比度

[AS3]as3滤镜ColorMatrix实现饱和度/色调/对比度/亮度的调整源代码

  1. /** 
  2.  * ColorMatrix by Grant Skinner. August 8, 2005 
  3.  * Updated to AS3 November 19, 2007 
  4.  * Visit www.gskinner.com/blog for documentation, updates and more free code. 
  5.  * 
  6.  * You may distribute this class freely, provided it is not modified in any way (including 
  7.  * removing this header or changing the package path). 
  8.  * 
  9.  * Please contact info@gskinner.com prior to distributing modified versions of this class. 
  10.  
  11.  *usage:http://www.gskinner.com/blog/archives/2005/09/flash_8_source.html 
  12.  
  13.  *var cm = new ColorMatrix(); 
  14.  * cm.adjustColor(20,20,20,20); 
  15.  *displayObject.filters = [new ColorMatrixFilter(cm)]; 
  16.  */ 
  17.  
  18. package com.gskinner.geom 
  19.  
  20.     dynamic public class ColorMatrix extends Array 
  21.     { 
  22.  
  23. // constant for contrast calculations: 
  24.         private static const DELTA_INDEX:Array = [ 
  25.             0,    0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1, 0.11, 
  26.             0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.21, 0.22, 0.24, 
  27.             0.25, 0.27, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38, 0.40, 0.42, 
  28.             0.44, 0.46, 0.48, 0.5, 0.53, 0.56, 0.59, 0.62, 0.65, 0.68,  
  29.             0.71, 0.74, 0.77, 0.80, 0.83, 0.86, 0.89, 0.92, 0.95, 0.98, 
  30.             1.0, 1.06, 1.12, 1.18, 1.24, 1.30, 1.36, 1.42, 1.48, 1.54, 
  31.             1.60, 1.66, 1.72, 1.78, 1.84, 1.90, 1.96, 2.0, 2.12, 2.25,  
  32.             2.37, 2.50, 2.62, 2.75, 2.87, 3.0, 3.2, 3.4, 3.6, 3.8, 
  33.             4.0, 4.3, 4.7, 4.9, 5.0, 5.5, 6.0, 6.5, 6.8, 7.0, 
  34.             7.3, 7.5, 7.8, 8.0, 8.4, 8.7, 9.0, 9.4, 9.6, 9.8,  
  35.             10.0 
  36.            ]; 
  37.  
  38.         // identity matrix constant: 
  39.         private static const IDENTITY_MATRIX:Array = [ 
  40.             1,0,0,0,0, 
  41.             0,1,0,0,0, 
  42.             0,0,1,0,0, 
  43.             0,0,0,1,0, 
  44.             0,0,0,0,1 
  45.            ]; 
  46.         private static const LENGTH:Number = IDENTITY_MATRIX.length; 
  47.  
  48.  
  49. // initialization: 
  50.         public function ColorMatrix(p_matrix:Array = null
  51.         { 
  52.             p_matrix = fixMatrix(p_matrix); 
  53.             copyMatrix(((p_matrix.length == LENGTH) ? p_matrix : IDENTITY_MATRIX)); 
  54.         } 
  55.  
  56.  
  57. // public methods: 
  58.         public function reset():void 
  59.         { 
  60.             for (var i:uint = 0; i < LENGTH; i++) 
  61.             { 
  62.                 this[i] = IDENTITY_MATRIX[i]; 
  63.             } 
  64.         } 
  65.  
  66.         public function adjustColor(p_brightness:Number, p_contrast:Number, p_saturation:Number, p_hue:Number):void 
  67.         { 
  68.             adjustHue(p_hue); 
  69.             adjustContrast(p_contrast); 
  70.             adjustBrightness(p_brightness); 
  71.             adjustSaturation(p_saturation); 
  72.         } 
  73.  
  74.         public function adjustBrightness(p_val:Number):void 
  75.         { 
  76.             p_val = cleanValue(p_val, 100); 
  77.             if (p_val == 0 || isNaN(p_val)) 
  78.             { 
  79.                 return; 
  80.             } 
  81.              multiplyMatrix([ 
  82.                  1,0,0,0,p_val, 
  83.                  0,1,0,0,p_val, 
  84.                  0,0,1,0,p_val, 
  85.                  0,0,0,1,0, 
  86.                  0,0,0,0,1 
  87.                 ]); 
  88.         } 
  89.  
  90.         public function adjustContrast(p_val:Number):void 
  91.         { 
  92.             p_val = cleanValue(p_val, 100); 
  93.             if (p_val == 0 || isNaN(p_val)) 
  94.             { 
  95.                 return; 
  96.             } 
  97.             var x:Number; 
  98.             if (p_val < 0
  99.             { 
  100.                 x = 127 + p_val / 100 * 127 
  101.             } 
  102.             else 
  103.             { 
  104.                 x = p_val % 1; 
  105.                 if (x == 0) 
  106.                 { 
  107.                     x = DELTA_INDEX[p_val]; 
  108.                 } 
  109.                 else 
  110.                 { 
  111.                     //x = DELTA_INDEX[(p_val<<0)]; // this is how the IDE does it. 
  112.                     x = DELTA_INDEX[(p_val << 0)] * (1 - x) + DELTA_INDEX[(p_val << 0) + 1] * x; // use linear interpolation for more granularity. 
  113.                 } 
  114.                 xx = x * 127 + 127; 
  115.             } 
  116.             multiplyMatrix([ 
  117.                  x/127,0,0,0,0.5*(127-x), 
  118.                  0,x/127,0,0,0.5*(127-x), 
  119.                  0,0,x/127,0,0.5*(127-x), 
  120.                  0,0,0,1,0, 
  121.                  0,0,0,0,1 
  122.                 ]); 
  123.  
  124.         } 
  125.  
  126.         public function adjustSaturation(p_val:Number):void 
  127.         { 
  128.             p_val = cleanValue(p_val, 100); 
  129.             if (p_val == 0 || isNaN(p_val)) 
  130.             { 
  131.                 return; 
  132.             } 
  133.             var x:Number = 1 + ((p_val > 0) ? 3 * p_val / 100 : p_val / 100); 
  134.             var lumR:Number = 0.3086; 
  135.             var lumG:Number = 0.6094; 
  136.             var lumB:Number = 0.0820; 
  137.             multiplyMatrix([ 
  138.                  lumR*(1-x)+x,lumG*(1-x),lumB*(1-x),0,0, 
  139.                  lumR*(1-x),lumG*(1-x)+x,lumB*(1-x),0,0, 
  140.                  lumR*(1-x),lumG*(1-x),lumB*(1-x)+x,0,0, 
  141.                  0,0,0,1,0, 
  142.                  0,0,0,0,1 
  143.                 ]); 
  144.  
  145.         } 
  146.  
  147.         public function adjustHue(p_val:Number):void 
  148.         { 
  149.             p_val = cleanValue(p_val, 180) / 180 * Math.PI; 
  150.             if (p_val == 0 || isNaN(p_val)) 
  151.             { 
  152.                 return; 
  153.             } 
  154.             var cosVal:Number = Math.cos(p_val); 
  155.             var sinVal:Number = Math.sin(p_val); 
  156.             var lumR:Number = 0.213; 
  157.             var lumG:Number = 0.715; 
  158.             var lumB:Number = 0.072; 
  159.             multiplyMatrix([ 
  160.                  lumR+cosVal*(1-lumR)+sinVal*(-lumR),lumG+cosVal*(-lumG)+sinVal*(-lumG),lumB+cosVal*(-lumB)+sinVal*(1-lumB),0,0, 
  161.                  lumR+cosVal*(-lumR)+sinVal*(0.143),lumG+cosVal*(1-lumG)+sinVal*(0.140),lumB+cosVal*(-lumB)+sinVal*(-0.283),0,0, 
  162.                  lumR+cosVal*(-lumR)+sinVal*(-(1-lumR)),lumG+cosVal*(-lumG)+sinVal*(lumG),lumB+cosVal*(1-lumB)+sinVal*(lumB),0,0, 
  163.                  0,0,0,1,0, 
  164.                  0,0,0,0,1 
  165.                 ]); 
  166.  
  167.         } 
  168.  
  169.         public function concat(p_matrix:Array):void 
  170.         { 
  171.             p_matrix = fixMatrix(p_matrix); 
  172.             if (p_matrix.length != LENGTH) 
  173.             { 
  174.                 return; 
  175.             } 
  176.             multiplyMatrix(p_matrix); 
  177.         } 
  178.  
  179.         public function clone():ColorMatrix 
  180.         { 
  181.             return new ColorMatrix(this); 
  182.         } 
  183.  
  184.         public function toString():String 
  185.         { 
  186.             return "ColorMatrix [ " + this.join(" , ") + " ]"; 
  187.         } 
  188.  
  189.         // return a length 20 array (5x4): 
  190.         public function toArray():Array 
  191.         { 
  192.             return slice(0, 20); 
  193.         } 
  194.  
  195. // private methods: 
  196.         // copy the specified matrix's values to this matrix: 
  197.         protected function copyMatrix(p_matrix:Array):void 
  198.         { 
  199.             var l:Number = LENGTH
  200.             for (var i:uint = 0; i < l; i++) 
  201.             { 
  202.                 this[i] = p_matrix[i]; 
  203.             } 
  204.         } 
  205.  
  206.         // multiplies one matrix against another: 
  207.         protected function multiplyMatrix(p_matrix:Array):void 
  208.         { 
  209.             var col:Array = []; 
  210.  
  211.             for (var i:uint = 0; i < 5; i++) 
  212.             { 
  213.                 for (var j:uint = 0; j < 5; j++) 
  214.                 { 
  215.                     col[j] = this[j + i * 5]; 
  216.                 } 
  217.                 for (j = 0; j < 5; j++) 
  218.                 { 
  219.                     var val:Number = 0
  220.                     for (var k:Number = 0; k < 5; k++) 
  221.                     { 
  222.                         val += p_matrix[j + k * 5] * col[k]; 
  223.                     } 
  224.                     this[j + i * 5] = val; 
  225.                 } 
  226.             } 
  227.         } 
  228.  
  229.         // make sure values are within the specified range, hue has a limit of 180, others are 100: 
  230.         protected function cleanValue(p_val:Number, p_limit:Number):Number 
  231.         { 
  232.             return Math.min(p_limit, Math.max(-p_limit, p_val)); 
  233.         } 
  234.  
  235.         // makes sure matrixes are 5x5 (25 long): 
  236.         protected function fixMatrix(p_matrix:Array = null):Array 
  237.         { 
  238.             if (p_matrix == null) 
  239.             { 
  240.                 return IDENTITY_MATRIX; 
  241.             } 
  242.             if (p_matrix is ColorMatrix) 
  243.             { 
  244.                 p_matrixp_matrix = p_matrix.slice(0); 
  245.             } 
  246.             if (p_matrix.length < LENGTH
  247.             { 
  248.                 p_matrixp_matrix = p_matrix.slice(0, p_matrix.length).concat(IDENTITY_MATRIX.slice(p_matrix.length, LENGTH)); 
  249.             } 
  250.             else if (p_matrix.length > LENGTH) 
  251.             { 
  252.                 p_matrixp_matrix = p_matrix.slice(0, LENGTH); 
  253.             } 
  254.             return p_matrix; 
  255.         } 
  256.     } 

 

热门文章推荐

请稍候...

保利威视云平台-轻松实现点播直播视频应用

酷播云数据统计分析跨平台播放器