颜色生成函数

3
让我们考虑以下情况:一个函数可以生成从白色到红色、从白色到蓝色、从白色到粉色、从白色到橙色等颜色代码。颜色代码采用RGB格式,取值范围为0到255。有什么想法吗?你能给我提供伪代码或这样的算法链接吗?

什么语言?只需谷歌RGB! - Dario
要查找橙色、粉色等颜色的RGB值,请在Google上搜索“RGB颜色轮”。 - ChrisW
这些从一种颜色过渡到另一种颜色的混合通常被称为渐变。 - sourcenouveau
5个回答

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);
    }
}

当然,除了线性插值之外,还有其他方法可以实现,但这可能是最简单的方法。请注意,如果您有很多步骤或较大的值,则会变得棘手,因为您需要考虑溢出的可能性。在这种情况下,您应该没问题 - 您不太可能想要超过256个步骤,并且最大值为255,因此您不会接近int的限制。
编辑:如评论中所述,RGB可能不是使用线性插值的最佳领域。您最好将从/到RGB值转换为HSL或HSV,并在其中进行插值。这可能取决于您的平台而易或难。前面一句话中的维基百科链接提供了适当计算的公式(如果未为您提供)。

2
在RGB中进行线性插值可能并不是您想要的。根据您所需的效果,使用HSL或HSV进行插值可能会获得更好的结果。考虑在纯红和纯绿之间进行插值的情况。在RGB中,这是(255,0,0)到(0,255,0)。线性插值给出了一个中点(127,127,0),这是一种深黄色。然而,您可能期望的是明亮的黄色。在HSV中,纯红是(0°,255,255),纯绿是(120°,255,255),因此仅插值色调将发生变化,中点将是纯黄色。 - Laurence Gonsalves
所有说的都对,但是当颜色以RGB形式提供时会更加棘手(与问题中描述的一样)。当然,仍然可以通过将初始RGB值转换为HSL / HSV来完成,但这可能对OP来说有点高级。我将编辑答案并提到这种可能性。 - Jon Skeet

3

算法:

  1. 寻找白色的RGB值
  2. 寻找其他颜色的RGB值(例如你提到的红色,蓝色,粉色和橙色)
  3. 计算RGB值,使得RGB分量在两个极端的RGB分量之间算术地排列

例如,如果一个极端是(0,0,0),另一个极端是(0,255,255),那么这两种颜色中间的颜色是(0,128,128)……而在这两个值之间四分之一的颜色是(0,64,64)。


不幸的是,通常在RGB中这样做不能给出最佳的视觉效果,特别是如果两种颜色不是相同的色调(尽管对于从白色到彩色或从黑色到彩色可能有效)。理想的过程应该是:找到原始和目标颜色的RGB值;转换为HLS;在HLS中进行插值;逐个将插值颜色转换回RGB。编写这个程序很无聊,但一旦完成,即使对于大量步骤,它也可以快速运行。 - heltonbiker

2
通过已知的具体点插值颜色常用于构建图形数据的配色方案。与显式插值公式相比,另一种选择是选择一个有一定设计背景的配色方案。这样的好处在于可以使用ColorBrewer提供的优秀配色方案。
即使需要插值,从一个经过精心设计的配色方案开始可能会产生更可用的结果。

1

从你想要渐变的两种颜色开始,并将它们分成红色、绿色和蓝色部分。

决定你想要经过多少个“步骤”进行淡化。

将R、G和B的不同之处除以步数。现在每种颜色都有一个“步长差异”。

循环遍历每个步骤,并在每次迭代中将步长差异添加到颜色值上。最后一步是四舍五入为整数。


0
你想改成什么颜色?将白色变为红色只需从255 255 255开始,递减后两个数值,直到得到255 0 0即可。蓝色则是保留最后一个值并递减至0 0 255等。

没错...但橙色、粉色等怎么办呢......这是我的问题。 - Duncan Benoit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接