我试图在不依赖任何框架的情况下使用纯数学来增加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会解决这个问题吗?
答案 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因子。