2017-10-22 377 views
1

如何手動計算RGB乘法器和偏移量以調整顏色的亮度,以使-1的參數全部爲黑色且1全爲白色?AS3:手動計算RGB乘法器和亮度從-1到1的偏移量

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

但是,如何計算大於0的亮度值的偏移?

+0

對於HSB/HSV這是最亮的R,G,B的...對於HSL它的暗和最亮的R,G和B – PrincePolka

+0

的平均您只是想映射平時** 0將255 **的亮度範圍轉換爲** - 1至1 **的範圍?這不會引入白化(亮度),因爲您必須將亮度映射到** - 1到0 **範圍(黑色水平vs原始顏色),並將亮度映射到** 0到1 **範圍(原始顏色vs白色水平)。你的最後兩行很混亂......我的意思是說,不能說「大於0的值」與前面提到的「如果小於1」是同一個東西,所以你可以計算出來,對吧?另外令人困惑的是_「這很容易,R,G和B只是乘以(1 +亮度)。」_這對紅色= 255是如何工作的? –

回答

1

這是每通道插值數學的簡單通道。它看起來並不簡單,僅僅因爲有三個通道,並且他們需要用於各種目的的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); 
}