package net.nicoptere.graphics { import flash.display.*; import flash.geom.*; /** * @author nicoptere */ public class ColorReduction { /** * * @param original :BitampData bitmapData source * @param increment :int nombre de couleurs ( 256 / increment ) * @param preserve :Boolean préserve le BitmapData original ( défaut : false ) * */ static public function reduceColor( original:BitmapData, increment:int = 128, preserve:Boolean = false ):BitmapData { //preserve l'original ou pas défaut false > écrase l'original var bmpd:BitmapData = original.clone(); if( !preserve ) { original.dispose(); } //borne l'incrément entre 1 et 254 sinon tout blanc ou tout noir increment = ( increment < 1 ) ? 1 : ( increment >= 255 ) ? 254 : increment; //tableaux pour les palleteMap var alp:Array = new Array(256); var red:Array = new Array(256); var green:Array = new Array(256); var blue:Array = new Array(256); var pas:int = 0; for(var i:uint = 1; i < 256; i++) { //indexation des composantes en fonction du pas alp[ i ] = ( pas & 0xFF ) << 24; red[ i ] = ( pas & 0xFF ) << 16; green[ i ] = ( pas & 0xFF ) << 8; blue[ i ] = ( pas & 0xFF ); if( i % increment == 0 ) { pas += increment; } } var pt:Point = new Point(0, 0); var rect:Rectangle = bmpd.rect; //largeur / hauteur var W:int = bmpd.width; var H:int = bmpd.height; //bitmaps de travail var Final:BitmapData = new BitmapData( W, H , true, 0xFF000000 ); var bmd:BitmapData = new BitmapData( W, H, true, 0xFF000000 ); //traite la couche alpha bmd.copyChannel( bmpd, bmpd.rect, pt, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA ); bmd.paletteMap( bmd, rect, pt, alp, alp, alp, alp); Final.copyChannel(bmd, rect, pt, BitmapDataChannel.ALPHA, BitmapDataChannel.ALPHA ); //traite la couche rouge bmd.fillRect( rect, 0xFF000000 ); bmd.copyChannel( bmpd, bmpd.rect, pt, BitmapDataChannel.RED, BitmapDataChannel.RED ); bmd.paletteMap( bmd, rect, pt, red, red, red); Final.copyChannel(bmd, rect, pt, BitmapDataChannel.RED, BitmapDataChannel.RED ); //traite la couche verte bmd.fillRect( rect, 0xFF000000 ); bmd.copyChannel( bmpd, bmpd.rect, pt, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN ); bmd.paletteMap( bmd, rect, pt, green, green, green); Final.copyChannel(bmd, rect, pt, BitmapDataChannel.GREEN, BitmapDataChannel.GREEN ); //traite la couche bleue bmd.fillRect( rect, 0xFF000000 ); bmd.copyChannel( bmpd, bmpd.rect, pt, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE ); bmd.paletteMap( bmd, rect, pt, blue, blue, blue); Final.copyChannel(bmd, rect, pt, BitmapDataChannel.BLUE, BitmapDataChannel.BLUE ); //redessine le bitmap bmpd.draw( Final ); //ménage bmd.dispose(); Final.dispose(); return bmpd; } } }