package { import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Point; [SWF(width=900, height=300, backgroundColor=0x000000)] /** * Demonstrates how BitmapData's paletteMap() can be used to set levels on an image by remapping * the brightness values of each pixel in each channel. */ public class graphic_flex_image_effects_04_Flex_LevelsTest extends graphic_flex_image_effects_04_Flex_AbstractImageLoader { /** * Constructor. Passes path of image to load to super. */ public function graphic_flex_image_effects_04_Flex_LevelsTest() { super("graphic-flex-image-effects-04-assets-goat.jpg"); } /** * Run after the image loads in super class. This creates two copies of the loaded image and adjusts * the levels on both, attaching all three images to the stage. */ override protected function runPostImageLoad():void { var bitmapData:BitmapData = _loadedBitmap.bitmapData; addChild(_loadedBitmap); // copy and set levels var clone:BitmapData = bitmapData.clone(); setLevels(clone, 0, 100, 200); var bitmap:Bitmap = new Bitmap(clone); bitmap.x = bitmapData.width; addChild(bitmap); // copy and set levels on another clone = bitmapData.clone(); setLevels(clone, 100, 127, 155); bitmap = new Bitmap(clone); bitmap.x = bitmapData.width*2; addChild(bitmap); } /** * Adjusts the brightness values of all pixels in the bitmap data by remapping the palette * using paletteMap(). * * @param bitmapData The bitmap data to adjust. * @param blackPoint The number between 0 and 255 below which all pixels * will have a brightness value of 0 in each channel. * @param midPoint The middle gray point in the image used to set the remapping * ratio between the black and white points. This value should be * be between the values set for the black and white points. * @param whitePoint The number between 0 and 255 above which all pixels * will have a brightness value of 255 in each channel. */ protected function setLevels( bitmapData:BitmapData, blackPoint:uint, midPoint:uint, whitePoint:uint ):void { // the arrays that will specify how each pixel value will be remapped in each channel var r:Array = []; var g:Array = []; var b:Array = []; // for all brightness values below the black point, set the new brightness value to 0 for (var i:uint = 0; i <= blackPoint; i++){ r.push(0); g.push(0); b.push(0); } var value:uint = 0; // in between the black and middle gray point, redistribute the brightness values evenly var range:uint = midPoint - blackPoint; for (i = blackPoint + 1; i <= midPoint; i++){ value = ((i - blackPoint)/range) * 127; r.push(value << 16); g.push(value << 8); b.push(value); } range = whitePoint - midPoint; // in between the middle gray and white point, redistribute the brightness values evenly for (i = midPoint + 1; i <= whitePoint; i++){ value = ((i - midPoint)/range) * 128 + 127; r.push(value << 16); g.push(value << 8); b.push(value); } // for all brightness values above the white point, set the new brightness value to 255 for (i = whitePoint + 1; i < 256; i++){ r.push(0xFF << 16); g.push(0xFF << 8); b.push(0xFF); } // remap the image palette to the new brightness values bitmapData.paletteMap( bitmapData, bitmapData.rect, new Point(), r, g, b ); } } }