можно через draw с blenMode DIFFERENCE
у меня такой вариант в результате сложился,
пример есть
Код AS3:
public static function bucketFill(bmd:BitmapData, x:int, y:int, color:int, tol:int = 64):void
{
var wandColor:int = bmd.getPixel(x, y);
//битмап цвета точки клика
var tmp:BitmapData = new BitmapData(bmd.width, bmd.height, false, wandColor);
//битмап разницы между оригиналом и цветом
tmp.draw(bmd, null, null, BlendMode.DIFFERENCE);
//ColorMatrixFilter, суммирующий все компоненты в синий канал
var clrMtrx:ColorAdjust = new ColorAdjust();
clrMtrx.setChannels(0,0,7);//всех в синий
tmp.applyFilter(tmp, tmp.rect, ORIGIN, clrMtrx.filter);
//кроем нулем что не попадает в tol
tmp.threshold(tmp, tmp.rect, ORIGIN, "<=", tol, 0x0, 0xFF);
//заливаем то, что получилось из точки клика
tmp.floodFill(x, y, 0xFF000000);
//красим оригинал заказанным цветом по свопадению с заливкой floodFill'ом
bmd.threshold(tmp, tmp.rect, ORIGIN, "==", 0xFF000000, color | 0xFF000000);
}
сейчас уже не помню деталей, но через попиксельное округление тоже вроде бы получалось, но как-то что-то не то, ну и медленней естественно