2

可能重复:
两种颜色之间的android颜色,基于百分比?
如何找到两种颜色之间的所有颜色?

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

4

2 回答 2

7

假设我们有 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。

于 2012-06-23T22:09:16.507 回答
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 度相同)变短。

于 2012-06-23T22:24:50.577 回答