2013-10-12 55 views
1

我試圖用純數學而不依賴於任何框架,以提高RGB的黑暗..如何增加RGB黑度?

所以,這裏是我的實現:

與R,G,B(每個從0到256)&提供darknessFactor(0到1)

// this is a pseudocode 
r*= darknessFactor; 
g*= darknessFactor; 
b*= darknessFactor; 

r= int (r); 
g= int (g); 
b= int (b); 

g <<= 8; 
r <<= 16; 

final_color= b + g + r ; 

然後,當我試圖使用它針對R = 00,G = 256,B = 0,darknessFactor = 0.1,我附近獲得暗紅色的結果!

有什麼想法?

EDIT

actionScript 3的ColorTransform能解決這個問題嗎?

+1

正在移動在ActionScript中定義的浮點數(25.6)? –

+0

我正在使用haxe,但我添加了ActionScript標籤以獲得更多有色人種的知識。 – simo

+0

您得到的是什麼final_color值? – Pan

回答

1

原則上,您的僞代碼看起來不錯,所以在您的實際代碼中必定存在問題。雖然真的很奇怪,你會得到一個綠色輸入的紅色結果。用你的代碼,這可能是一個大於1的因子,因爲你沒有夾住通道,所以綠色通道可能會溢出到紅色通道。

這將工作:

function clamp(channel:Float) { 
    var v = Std.int(channel); 
    return 
    if (v < 0) 0; 
    else if (v > 0xFF) 0xFF; 
    else v; 
} 
function darken(color:Int, factor:Float) { 
    var r = (color >> 16) & 0xFF; 
    var g = (color >> 8) & 0xFF; 
    var b = color & 0xFF; 

    return 
    (clamp(r * factor) << 16) 
    + (clamp(g * factor) << 8) 
    + clamp(b * factor); 
} 

你可以在這裏進行測試:http://try.haxe.org/#b328e

0

你應該使用RGB的HSV intead。首先,RGB轉換爲HSV。

秒,減少v(亮度[0到1])。

最後,HSV轉換爲RGB。

您可以輕鬆實現轉換程序。 或者,可以找到庫。

0

的ColorTransform將解決這個問題,而無需編寫任何新的代碼最簡單的方法。

請參閱here

乘數屬性將是你想要的,以加深當前的顏色。

var colorInfo:ColorTransform = myDisplayObject.transform.colorTransform; 

// Make some color transformations here. 
// Reduce colour by 10% 
colorInfo.redMultiplier = 0.9; 
colorInfo.greenMultiplier = 0.9; 
colorInfo.blueMultiplier = 0.9; 

// Commit the change. 
myDisplayObject.transform.colorTransform = colorInfo; 
0

對於通過百分比變暗的RGB(R1,G1,B1),新RGB(R2,G2,B2)/的P%因子應該是:

R2 = R1 - (R1/100)*P 
    G2 = G1 - (G1/100)*P 
    B2 = B1 - (B1/100)*P 

這僅僅是解決您的具體問題。如果您想要更先進的工作,請查看HSL色彩空間以及如何使用L因子。