За исключением того, что ваш входной цвет имеет некоторый оттенок серого, RGB не собирается его сокращать. RGB полезен для хранения пиксельных данных, но ужасно манипулировать «визуально» осмысленным способом.
Некоторое время назад я написал аналогичный ответ в списке флеш-кодеров на эту тему, поэтому ниже приводится более или менее дословная копия и вставка этого ответа. Я надеюсь, что вы найдете это полезным.
Точным способом изменения оттенка основного цвета является преобразование значения RGB в цветовое пространство HSL , затем настройка яркости (яркости) и преобразование обратно в RGB.
Вот удобный класс для преобразования RGB <-> HLS.
http://www.dreaminginflash.com/2007/11/19/hls-to-rgb-rgb-to-hls/
Вот некоторый тестовый код:
import ColorUtils;
var rgb:Number = 0x336699;
var hls:Object = ColorUtils.RGBtoHLS(rgb);
var darkL:Number = Math.max(hls.l - 0.2,0);
var lightL:Number = Math.min(hls.l + 0.2,1);
var dark:Number = ColorUtils.HLStoRGB(hls.h,darkL,hls.s);
var light:Number = ColorUtils.HLStoRGB(hls.h,lightL,hls.s);
var origBmd:BitmapData = new BitmapData(40,40,false,rgb);
var darkerBmd:BitmapData = new BitmapData(40,40,false,dark);
var lighterBmd:BitmapData = new BitmapData(40,40,false,light);
var origBm:Bitmap = new Bitmap(origBmd);
var darkerBm:Bitmap = new Bitmap(darkerBmd);
var lighterBm:Bitmap = new Bitmap(lighterBmd);
darkerBm.y = 0;
origBm.y = 50;
lighterBm.y = 100;
addChild(origBm);
addChild(darkerBm);
addChild(lighterBm);