计算颜色渐变

时间:2008-11-26 02:39:00

标签: colors fade

给定两种颜色和 n 步骤,如何计算n种颜色,包括产生淡化效果的两种给定颜色?

如果可能的话,首选伪代码,但这可能是用Java实现的。

谢谢!

7 个答案:

答案 0 :(得分:21)

将每种颜色分成RGB组件,然后计算所需的各个步骤。

oldRed = 120;
newRed = 200;
steps = 10;
redStepAmount = (newRed - oldRed) / steps;

currentRed = oldRed;
for (i = 0; i < steps; i++) {
   currentRed += redStepAmount;
}

显然将其扩展为绿色和蓝色。

答案 1 :(得分:11)

您还应该检查两个相关的好问题:

请注意,在HSV色彩空间而不是RGB中,您通常会做得更好 - 它会为人眼产生更令人愉悦的色彩(降低碰撞的可能性或负光学特性)。

祝你好运!

- 亚当

答案 2 :(得分:4)

如果您想要一个看起来像大多数颜色选择器GUI小部件的混合,您真的想要转换为HSL或HSV。从那里开始,每个维度的线性插值都可能很好。

尝试直接在RGB色彩空间中进行任何插值是一个坏主意。这太过于非线性(并且没有,伽马校正在这种情况下无济于事)。

答案 3 :(得分:4)

对于那些寻找可以复制和粘贴的东西的人。快速实现RGB颜色功能。返回单个颜色,即ratio接近rgbColor2的数量。

function fadeToColor(rgbColor1, rgbColor2, ratio) {
    var color1 = rgbColor1.substring(4, rgbColor1.length - 1).split(','),
        color2 = rgbColor2.substring(4, rgbColor2.length - 1).split(','),
        difference,
        newColor = [];

    for (var i = 0; i < color1.length; i++) {
        difference = color2[i] - color1[i];
        newColor.push(Math.floor(parseInt(color1[i], 10) + difference * ratio));
    }

    return 'rgb(' + newColor + ')';
}

答案 4 :(得分:1)

问题是你想要发生什么转变?如果转置到HSV色彩空间并给出

FF0000和00FF00

它将从红色变为黄色变为绿色。

但是,如果您将“黑色”或其他阴影定义为混合的中点,则必须先将该颜色调到ff0000-> 000000-> 00ff00或通过白色:ff0000 - &gt; ffffff - &gt; 00FF00。

通过HSV进行转换可能很有趣,因为您必须使用一点触发来将圆形贴图映射到矢量分量。

答案 5 :(得分:1)

最简单的方法是在颜色组件之间进行线性插值(参见nickf的响应)。请注意,眼睛是高度非线性的,所以看起来你不一定会做出任何步骤。一些颜色空间试图解决这个问题(CIE可能?),所以你可能想先转换成另一个颜色空间,插值,然后转换回RGB或你正在使用的任何颜色空间。

答案 6 :(得分:0)

this answer

怎么样?
DF <- read.table(text = "event seconds person
                 1      0.0     Bob
                 2      15.0    Bob
                 3      28.5    Bob
                 41     256.0   Bob
                 42     261.0   Bob
                 43     266.0   Bob
                 44     268.5   Bob
                 45     272.0   Bob
                 46     273.0   Bob
                 49     569.0   Bob
                 80     570.5   Bob
                 81     581.0   Bob", header = TRUE)

DF$personEvent <- cumsum(c(1L, diff(DF$event)) != 1L)
#   event seconds person personEvent
#1      1     0.0    Bob           0
#2      2    15.0    Bob           0
#3      3    28.5    Bob           0
#4     41   256.0    Bob           1
#5     42   261.0    Bob           1
#6     43   266.0    Bob           1
#7     44   268.5    Bob           1
#8     45   272.0    Bob           1
#9     46   273.0    Bob           1
#10    49   569.0    Bob           2
#11    80   570.5    Bob           3
#12    81   581.0    Bob           3