package { import flash.display.BitmapData; import flash.display.GradientType; import flash.display.Shape; import flash.filters.ColorMatrixFilter; import flash.geom.Matrix; import flash.geom.Point; [SWF(width=300, height=330, backgroundColor=0x000000)] /** * Demonstrates the use of BitmapData's paletteMap() to remap an image's color palette to a custom gradient. */ public class graphic_flex_image_effects_04_Flex_GradientMapTest extends graphic_flex_image_effects_04_Flex_AbstractImageLoader { /** * Constructor. Passes path of image to load to super class. */ public function graphic_flex_image_effects_04_Flex_GradientMapTest() { super("graphic-flex-image-effects-04-assets-goat.jpg"); } /** * Run after the image loads in super class. This creates a shape and draws into it a gradient which can then * be used to populate color arrays with values for use a palette remapping of the loaded image. */ override protected function runPostImageLoad():void { var bitmapData:BitmapData = _loadedBitmap.bitmapData; var width:uint = stage.stageWidth; var height:uint = stage.stageHeight; // gradient values to use for the custom gradient remapping var colors:Array = [0x0066FD, 0xFFFFFF, 0xFFFFFF, 0x996600, 0xFFCC00, 0xFFFFFF]; var ratios:Array = [0, 95, 124, 130, 165, 255]; var alphas:Array = [1, 1, 1, 1, 1, 1]; var matrix:Matrix = new Matrix(); matrix.createGradientBox(256, height); // draw gradient into shape so that its data can be captured var shape:Shape = new Shape(); shape.graphics.beginGradientFill(GradientType.LINEAR, colors, alphas, ratios, matrix); shape.graphics.drawRect(0, 0, 256, height); shape.graphics.endFill(); var gradient:BitmapData = new BitmapData(256, height); gradient.draw(shape); // run through all 256 horizontal pixels of gradient to determine the colors var red:Array = []; var zeros:Array = []; var color:uint; for (var i:uint = 0; i < 256; i++) { color = gradient.getPixel(i, 0); // color only needs to be pushed into one channel array since // all three channels are combined in final palette remapping red.push(color); // a 0 is pushed into the other array, which will be used for both green and blue arrays zeros.push(0); } gradient.dispose(); // add the shape to the stage so that gradient can be seen and compared shape.scaleX = width/256; addChild(shape); // desaturate the image before its palette is remapped desaturate(bitmapData); bitmapData.paletteMap( bitmapData, bitmapData.rect, new Point(), red, zeros, zeros ); addChild(_loadedBitmap); } /** * Fully desaturates the specified image using the ColorMatrixFilter. * * @param bitmapData The image ot desaturate. */ private function desaturate(bitmapData:BitmapData):void { var matrix:Array = [ 0.3, 0.59, 0.11, 0, 0, 0.3, 0.59, 0.11, 0, 0, 0.3, 0.59, 0.11, 0, 0, 0, 0, 0, 1, 0 ]; bitmapData.applyFilter( bitmapData, bitmapData.rect, new Point(), new ColorMatrixFilter(matrix) ); } } }