package { import flash.display.BitmapData; import flash.filters.BevelFilter; import flash.filters.BitmapFilter; import flash.filters.BlurFilter; import flash.filters.ColorMatrixFilter; import flash.geom.Point; [SWF(width=300, height=300, backgroundColor=0xFFEFEE)] /** * Demonstrates use of BitmapData's threshold() to isolate a color or brightness value. This example * uses threshold() to copy all pixels under a certain brightness into a new transparent bitmap, * then applies a filter to the resulting image. */ public class graphic_flex_image_effects_04_Flex_ThresholdTest extends graphic_flex_image_effects_04_Flex_AbstractImageLoader { private static const THRESHOLD:uint = 0xFF660000; private static const PAINT_COLOR:uint = 0xFF883300; /** * Constructor. Passes path of image to load to super class. */ public function graphic_flex_image_effects_04_Flex_ThresholdTest() { super("graphic-flex-image-effects-04-assets-goat.jpg"); } /** * Run after the image loads in super class. This creates a new transparent bitmap data and copies over pixels * under a certain brightness into it. Then two filters applied to produce a pooling paint effect. */ override protected function runPostImageLoad():void { var bitmapData:BitmapData = _loadedBitmap.bitmapData; // new data should be transparent by default var copiedData:BitmapData = new BitmapData(bitmapData.width, bitmapData.height, true, 0x00000000); // make loaded data grayscale desaturate(bitmapData); // copy in all pixels under a certain brightness from grayscale image into transparent image; // we only need to look at one channel since in a grayscale image all channels hold the same data copiedData.threshold( bitmapData, bitmapData.rect, new Point(), "<", THRESHOLD, PAINT_COLOR, 0xFFFF0000, false ); // apply a blur and bevel for the final effect applyFilter(copiedData, new BlurFilter(1.2, 1.2)); applyFilter(copiedData, new BevelFilter()); // copy in new data _loadedBitmap.bitmapData = copiedData; addChild(_loadedBitmap); bitmapData.dispose(); } /** * Applies the specified filter to the bitmap data. * * @param bitmapData The data to which to apply the filter. * @param filter The bitmap filter to apply to the data. */ private function applyFilter(bitmapData:BitmapData, filter:BitmapFilter):void { bitmapData.applyFilter( bitmapData, bitmapData.rect, new Point(), filter ); } /** * Applies a ColorMatrixFilter to desaturate the image. * * @param bitmapData The data to which to apply the filter. */ 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 ]; applyFilter(bitmapData, new ColorMatrixFilter(matrix)); } } }