2009-05-17 88 views
3

让我们考虑以下情形:可以从白到红生成代码颜色的功能,从白色变成蓝色,从白色到粉红色,从白色到橙色等颜色生成功能

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

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

+0

什么语言?只需google RGB! – Dario 2009-05-17 19:16:59

+0

要查找橙色,粉红色等的RGB值,请使用Google for'RGB色轮'。 – ChrisW 2009-05-17 19:24:08

+0

从一种颜色到另一种颜色的混合通常称为渐变。 – 2009-06-23 02:10:19

回答

12

听起来好像你是在linear interpolation之后 - 在你的情况下,从白色插值到指定的颜色。例如,在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 or HSV,并对这些进行插值。根据您的平台,这可能很容易或很棘手。上一句中的维基百科链接给出了适当计算的公式,如果它们没有提供给您的话。

0

你想改变什么颜色?白到红只是一种情况,以255 255 255开始,并且递减第二次直到你有255 0 0.蓝色将保持最后的值并递减以0 0 255结束,等等

+0

那是对的......但是橙色,粉红色......等等......这是我的问题 – 2009-05-17 19:19:50

3

算法:

  1. 查找白色
  2. 的RGB值查找其他颜色的RGB值(例如你提到红色,蓝色,粉色,橙色)
  3. 计算RGB值,其RGB分量算术的RGB之间两个极端的组成部分

例如,如果一个极端是(0,0,0),另一个极端是(0,255,255),那么这两种颜色之间的中间值是(0,128,128)...并且该值是(0,0,0)的四分之一这两个值之间的方式是(0,64,64)。

1

从您想要的两种颜色开始渐变,并将它们分解为R,G和B部分。

决定要淡入多少“步骤”。

将R,G和B部分之间的差值除以步骤数量。您现在对每种颜色都有“阶差”。

循环执行每个步骤,并为每次迭代添加一次差异到颜色值一次。舍入到整数最后你做的事情。

2

通过已知的特定点插值颜色通常用于构建绘制数据的配色方案。显式插值公式的另一种选择是选择一种在其表示背后具有某种设计的颜色方案。这种方案的一个很好的来源是ColorBrewer

即使您需要内插,从设计良好的配色方案开始可以产生更多可用的结果。