AS3:手动计算从 -1 到 1 的 RGB 乘数和亮度偏移量

AS3: Manually calculating RGB multipliers and offsets for brightness from -1 to 1

您将如何手动计算 RGB 乘数和偏移量来调整颜色的亮度,以便参数 -1 为全黑而 1 为全白?

如果小于 1,则很容易。 R、G、B只是乘以(1+亮度)。

但是你如何计算亮度值大于 0 的偏移量?

这是简单的通道逐通道插值数学。看起来不简单只是因为有三个频道,而且他们需要de/serialization 用于各种目的。

// Usage.

acoolor:uint = parseRGB(200, 150, 100);

trace(colorToRGB(brightNess(acoolor, 0.5)));
trace(colorToRGB(brightNess(acoolor, -0.5)));

// Implementation.

function parseRGB(ared:uint, agreen:uint, ablue:uint):uint
{
    var result:uint;

    result += (ared << 16) & 0xFF0000;
    result += (agreen << 8) & 0xFF00;
    result += (ablue) & 0xFF;

    return result;
}

function colorToRGB(acolor:uint):Array
{
    result = new Array;

    result[0] = (acolor >> 16) & 0xFF;
    result[1] = (acolor >> 8) & 0xFF;
    result[2] = (acolor) & 0xFF;

    return result;
}

function RGBToColor(anrgb:Array):uint
{
    return parseRGB.apply(this, anrgb);
}

function brightChannel(achannel:uint, adjust:Number):uint
{
    if (adjust <= -1) return 0;
    if (adjust >= 1) return 255;
    if (adjust < 0) return achannel * (1 + adjust);
    if (adjust > 0) return achannel + (255 - achannel) * adjust;

    // If adjust == 0
    return achannel;
}

function brightNess(acolor:uint, adjust:Number):uint
{
    var anrgb:Array = colorToRGB(acolor);

    for (var i:int = 0; i < 3; i++)
        anrgb[i] = brightChannel(anrgb[i], adjust);

    return RGBToColor(anrgb);
}