topical media & game development

talk show tell print

#graphic-flex-image-effects-07-source-aether-utils-Adjustments.ax

#graphic-flex-image-effects-07-source-aether-utils-Adjustments.ax [swf] [flash] flex


  package aether.utils {
  
          import flash.display.BitmapData;
          import flash.display.BitmapDataChannel;
          import flash.display.BlendMode;
          import flash.filters.ColorMatrixFilter;
          import flash.geom.ColorTransform;
          import flash.geom.Point;
          
          public class @ax-graphic-flex-image-effects-07-source-aether-utils-Adjustments {
          
                  static public const IDENTITY_MATRIX:Array = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0];
                  static public const GRAYSCALE_MATRIX:Array = [.3, .59, .11, 0, 0, .3, .59, .11, 0, 0, .3, .59, .11, 0, 0, 0, 0, 0, 1, 0];
          
                  static public function setLevels(
                          bitmapData:BitmapData,
                          blackPoint:uint,
                          midPoint:uint,
                          whitePoint:uint
                  ):void {
                          var levels:Object={};
                          levels.r=[];
                          levels.g=[];
                          levels.b=[];
                          for (var i:uint=0;i<=blackPoint;i++){
                                  levels.r.push(0);
                                  levels.g.push(0);
                                  levels.b.push(0);
                          }
                          var n:uint=0;
                          var d:uint=midPoint-blackPoint;
                          for (i=blackPoint+1;i<=midPoint;i++){
                                  n=(((i-blackPoint)/d)*127)|0;
                                  levels.r.push(n<<16);
                                  levels.g.push(n<<8);
                                  levels.b.push(n);
                          }
                          d=whitePoint-midPoint;
                          for (i=midPoint+1;i<=whitePoint;i++){
                                  n=((((i-midPoint)/d)*128)|0)+127;
                                  levels.r.push(n<<16);
                                  levels.g.push(n<<8);
                                  levels.b.push(n);
                          }
                          for (i=whitePoint+1;i<256;i++){
                                  levels.r.push(0xFF<<16);
                                  levels.g.push(0xFF<<8);
                                  levels.b.push(0xFF);
                          }
                          bitmapData.paletteMap(bitmapData, bitmapData.rect, new Point(), levels.r, levels.g, levels.b);
                  }
          
                  static public function setChannelLevels(
                          bitmapData:BitmapData,
                          red:Array,
                          green:Array,
                          blue:Array
                  ):void {
                          var ls:Array=[];
                          var cs:Array=[red,green,blue];
                          var b:Number;
                          var m:Number;
                          var w:Number;
                          var i:uint;
                          var n:Number;
                          var d:Number;
                          var c:Array;
                          var l:Array;
                          var sh:Number;
                          for (var j:uint=0;j<3;j++){
                                  l=ls[j]=[];
                                  c=cs[j];
                                  sh=8*(2-j);
                                  b=c[0];
                                  for (i=0;i<=b;i++){
                                          ls[j].push(0);
                                  }
                                  n=0;
                                  m=c[1];
                                  d=m-b;
                                  for (i=b+1;i<=m;i++){
                                          n=(((i-b)/d)*127)|0;
                                          l.push(n<<(sh));
                                  }
                                  w=c[2];
                                  d=w-m;
                                  for (i=m;i<=w;i++){
                                          n=((((i-m)/d)*128)|0)+127;
                                          l.push(n<<(sh));
                                  }
                                  for (i=w+1;i<256;i++){
                                          l.push(0xFF<<(sh));
                                  }
                          }
                          bitmapData.paletteMap(bitmapData,bitmapData.rect, new Point(), ls[0], ls[1], ls[2]);
                  }
          
                  static public function invert(bitmapData:BitmapData):void {
                          bitmapData.colorTransform(bitmapData.rect, new ColorTransform(-1, -1, -1, 1, 255, 255, 255, 0));
                  }
          
                  static public function adjustBrightness(bitmapData:BitmapData, amount:Number):void {
                          if (amount < 0) {
                                  var bottom:uint = -amount;
                                  setLevels(bitmapData, bottom, bottom + (255-bottom)/2, 255);
                          } else {
                                  var top:uint = 255-amount;
                                  setLevels(bitmapData, 0, top/2, top);
                          }
                  }
                  
                  static public function adjustContrast(bitmapData:BitmapData, amount:Number):void {
                          amount += 1;
                          var filter:ColorMatrixFilter = new ColorMatrixFilter([
                                  amount,      0,      0, 0, (128 * (1 - amount)), 
                                       0, amount,      0, 0, (128 * (1 - amount)), 
                                       0,      0, amount, 0, (128 * (1 - amount)), 
                                       0,      0,      0, 1,                  1
                          ]);
                          ImageUtil.applyFilter(bitmapData, filter);
                  }
          
                  static public function threshold(bitmapData:BitmapData, level:uint=128):void {
                          desaturate(bitmapData);
                          setLevels(bitmapData, level, level, level);
                  }
  
                  static public function posterize(bitmapData:BitmapData, levels:uint=2):void {
                          levels = Math.max(2, levels);
  
                          var red:BitmapData = ImageUtil.getChannelData(bitmapData, BitmapDataChannel.RED);
                          var green:BitmapData = ImageUtil.getChannelData(bitmapData, BitmapDataChannel.GREEN);
                          var blue:BitmapData = ImageUtil.getChannelData(bitmapData, BitmapDataChannel.BLUE);
                          var sourceChannels:Array = [red, green, blue];
                          
                          var redFiltered:BitmapData = new BitmapData(bitmapData.width, bitmapData.height, true, 0x00000000);
                          var greenFiltered:BitmapData = redFiltered.clone();
                          var blueFiltered:BitmapData = redFiltered.clone();
                          var filteredChannels:Array = [redFiltered, greenFiltered, blueFiltered];
  
                          var channelData:BitmapData;
                          var level:uint;
                          var colorTransform:ColorTransform;
                          var brightnessAdjust:uint;
                          var j:uint;
                          levels--;
                          for (var i:uint = 0; i < levels; i++) {
                                  level = 255*((levels-i)/(levels+1));
                                  brightnessAdjust = 255*((levels-i-1)/(levels));
                                  colorTransform = new ColorTransform(1, 1, 1, 1, brightnessAdjust, brightnessAdjust, brightnessAdjust);
                                  for (j = 0; j < 3; j++) {
                                          channelData = (sourceChannels[j] as BitmapData).clone();
                                          setLevels(channelData, level, level, level);
                                          (filteredChannels[j] as BitmapData).draw(channelData, null, colorTransform, BlendMode.MULTIPLY);
                                  }
                          }
                          
                          ImageUtil.copyChannel(redFiltered, bitmapData, BitmapDataChannel.RED);
                          ImageUtil.copyChannel(greenFiltered, bitmapData, BitmapDataChannel.GREEN);
                          ImageUtil.copyChannel(blueFiltered, bitmapData, BitmapDataChannel.BLUE);
                  }
  
                  static public function desaturate(bitmapData:BitmapData, percent:Number=1):void {
                          saturate(bitmapData, 1-percent);
                  }
          
                  static public function saturate(bitmapData:BitmapData, amount:Number):void {
                          var r:Number = 0.3;
                          var g:Number = 0.59;
                          var b:Number = 0.11;
                          var p:Number = 1-amount;
                          var matrix:Array=[
                                  p*r+amount, p*g,        p*b,        0, 0,
                                  p*r,        p*g+amount, p*b,        0, 0,
                                  p*r,        p*g,        p*b+amount, 0, 0,
                                  0,          0,          0,          1, 0
                          ];
                          ImageUtil.applyFilter(bitmapData, new ColorMatrixFilter(matrix));
                  }
  
          }
          
  }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.