如何从一个到另一个获得中间色?

时间:2012-06-23 21:59:16

标签: algorithm

  

可能重复:
  android color between two colors, based on percentage?
  How to find all the colors between two colors?

一开始,我们有两种颜色的RGB和一个数字,用于它们之间的中间色。方法必须返回具有所需颜色的数组。非常需要有关算法的帮助。

2 个答案:

答案 0 :(得分:6)

假设我们有2种颜色(R1,G1,B1)(R2,G2,B2)和N种中间色:

for i from 1 to N:
    Ri = R1 + (R2-R1) * i / N
    Bi = B1 + (B2-B1) * i / N
    Gi = G1 + (G2-G1) * i / N
    AddToArray(Ri,Gi,Bi)

这就是你要找的东西吗?

PS:如果你想拥有更自然的色彩渐变,我建议使用HSL色彩空间而不是RGB。

答案 1 :(得分:2)

让你当前的cR,cG和cB值为0%,让R,G和B值为100%,然后你必须迭代i = 1到100,每次迭代加上cRGB + i *( RGB - cRGB)。您不必使用100种中间色,您可以使用其中的N种。

function(currentColor, desiredColor, N) {

    var colors = [],
    cR = currentColor.R,
    cG = currentColor.G,
    cB = currentColor.B,
    dR = desiredColor.R - cR,
    dG = desiredColor.G - cG,
    dB = desiredColor.B - cB;

    for(var i = 1; i <= N; i++) {
        colors.push(new Color(cR + i * dR / N, cG + i * dG / N, cB + i * dB / N));
    }

    return colors;
}

但是,这不会给你很好的中间色。您应该做的第一件事是将颜色转换为HSV或类似的颜色空间,其中强度与色调和饱和度分开。这将为您提供更好的中间色彩。 http://en.wikipedia.org/wiki/HSL_and_HSV

要做到这一点,首先将颜色转换为HSV,并运行与上述相同的算法,但使用HS和V而不是RGB,但请记住,S和V的最小值为0,最大值为1,而H以0到360之间的度数表示。如果您希望H尽可能快地从当前颜色变为目标颜色,则可能需要对H执行某些操作,例如如果cH = 10且dH = 50,则从10 - >开始。 50是最短的,但是如果cH = 10并且dH = 350,则从10 - >开始。 -10(相同于350度)更短。