1

我试图在不依赖任何框架的情况下使用纯数学来增加 RGB 的黑暗度..

所以,这是我的实现:

提供 R、G、B(每个从 0 到 256)和 darkFactor(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、darkFactor= 0.1 使用它时,我得到的结果接近深红色!

任何想法?

编辑

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

4

4 回答 4

1

您应该使用 HSV 而不是 RGB。

首先,RGB 转换为 HSV。

其次,降低 v(brightness[0 to 1])。

最后,HSV 转换为 RGB。

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

于 2013-10-12T08:53:33.977 回答
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

于 2013-10-12T22:14:34.660 回答
0

ColorTransform 将是解决此问题的最简单方法,无需编写任何新代码。

这里

乘数属性将是您想要的以使当前颜色变暗。

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;
于 2013-10-13T09:22:33.130 回答
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 因子。

于 2013-11-13T16:16:23.703 回答