Вот что по итогу получилось, может кому пригодится
Код AS3:
/**
* Возвращает цвет темнее заданного на указанную величину
* @param $color Исходный цвет
* @param $koeff На сколько делать темнее
* @return Результирующий цвет
*/
public static function darker( $color:uint, $koeff:Number = .7 ):uint
{
var r:Number = 0;
var g:Number = 0;
var b:Number = 0;
r = ($color >> 16 & 0xFF) * $koeff;
g = ($color >> 8 & 0xFF) * $koeff;
b = ($color & 0xFF) * $koeff;
return r << 16 | g << 8 | b;
}
/**
* Находит среднее значение цвета всего изображения
* @param $source Исходное изображение
* @param $scale масштаб изображения для подсчета цвета
* @return результирующий цвет
*/
public static function findMedianColour( $source:BitmapData, $scale:Number = .25 ):uint
{
var xScale:uint = Math.round( $source.width * $scale );
var yScale:uint = Math.round( $source.height * $scale );
var mtrx:Matrix = new Matrix();
var tempBmd:BitmapData = new BitmapData(xScale, yScale);
mtrx.scale($scale,$ scale);
tempBmd.draw($source, mtrx);
var r:uint = 0;
var g:uint = 0;
var b:uint = 0;
var pCount:uint = xScale * yScale;
var pixel:uint;
for (var px:int = 0; px < xScale; px++)
{
for (var py:int = 0; py < yScale; py++)
{
pixel = tempBmd.getPixel(px, py);
r += pixel >> 16 & 0xFF;
g += pixel >> 8 & 0xFF;
b += pixel & 0xFF;
}
}
tempBmd.dispose();
r /= pCount;
g /= pCount;
b /= pCount;
return r << 16 | g << 8 | b;
}
Поправил функцию darker, c умножением каждой компоненты затемнение выглядит более правильно.