颜色生成功能

Dun*_*oit 3 algorithm rgb

让我们考虑以下场景:一个可以生成从白色到红色,从白色到蓝色,从白色到粉红色,从白色到橙色等的代码颜色的功能.

颜色代码为RGB格式,值为0到255.

有任何想法吗?你能给我一个伪代码或链接到这样的算法吗?

Jon*_*eet 12

这听起来像是在线性插值之后 - 在您的情况下,从白色插值到指定的颜色.例如,在C#中:

public IEnumerable<Color> Interpolate(Color from, Color to, int steps)
{
    int range = steps-1; // Makes things a bit easier
    for (int i=0; i < steps; i++)
    {
        // i is the proportion of the "to" colour to use.
        // j is the proportion of the "from" colour to use.

        int j = range - i;
        int r = ((from.R * j) + (to.R * i)) / range;
        int g = ((from.G * j) + (to.G * i)) / range;
        int b = ((from.B * j) + (to.B * i)) / range;
        yield return new Color(r, g, b);
    }
}
Run Code Online (Sandbox Code Playgroud)

当然,除了线性插值之外,还有其他方法可以做到这一点,但这可能是最简单的.请注意,如果您有很多步骤或更大的值,这会变得棘手,因为您需要考虑溢出的可能性.在这种情况下你应该没问题 - 你不太可能需要超过256步,最大值是255,所以你不会接近ints 的限制.

编辑:如评论中所述,RGB可能不是使用线性插值的最佳域.您可能最好将from/to RGB值转换为HSL或HSV,并对其进行插值.根据您的平台,这可能很容易或很棘手.如果没有为您提供适当的计算,则上一句中的维基百科链接会给出公式.

  • 实际上,您可能不希望在RGB中进行线性插值.在HSL或HSV中进行插值可能会获得更好的结果,具体取决于您正在寻找的效果.考虑在纯红色和纯绿色之间进行插值的情况.在RGB中,(255,0,0)到(0,255,0).线性插值给出(127,127,0)的中点,它是深黄色.但是,你可能期待一个明亮的黄色.在HSV中,纯红色为(0°,255,255),纯绿色为(120°,255,255),因此在插值时,仅色调将发生变化,中点将为纯黄色. (2认同)