可能重复:
android color between two colors, based on percentage?
How to find all the colors between two colors?
一开始,我们有两种颜色的RGB和一个数字,用于它们之间的中间色。方法必须返回具有所需颜色的数组。非常需要有关算法的帮助。
答案 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度)更短。