如何增加RGB黑暗?

时间:2013-10-12 05:33:01

标签: actionscript-3 colors rgb haxe

我试图在不依赖任何框架的情况下使用纯数学来增加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时,我得到的结果接近暗红色!

有什么想法吗?

修改

ActionScript 3的ColorTransform会解决这个问题吗?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

你应该使用RGB的HSV intead。

首先,RGB转换为HSV。

秒,降低v(亮度[0到1])。

最后,HSV转换为RGB。

您可以轻松实现转换程序。 或者,可以找到图书馆。

答案 2 :(得分: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;

答案 3 :(得分:0)

对于RGB(R1,G1,B1),以p%的百分比/因子变暗的新RGB(R2,G2,B2)应为:

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

这只是您特定问题的解决方案。如果你想要更先进的东西,那么请看看HSL色彩空间以及如何使用它的L因子。