使用渐变颜色c ++

时间:2016-11-16 10:11:24

标签: c++ arrays colors linear-gradients

我要做的是用彩虹渐变填充数组。该数组应该包含256个填充了十六进制颜色值的条目。

rainbow

像:

array[0] = 0xFF0000 //red
...
array[85] = 0xFFA200 //orange
...
array[170] = 0x00AF0F //green
...
array[255] = 0xAE00FF //purple

因为我不想“手动”将所有256种颜色分配给数组我正在寻找动态方法。它不一定需要是上面显示的ranbow。图片仅供演示之用。

有什么建议如何在(最好)短代码片段中做这样的事情,避免一些嵌套的for循环?

2 个答案:

答案 0 :(得分:1)

执行所需操作的一种方法是从开始到结束值插入每种组件颜色(RGB)。这意味着使用尽可能相同大小的步骤。

要获得RGB组件,必须进行一些位操作。此代码为您提供了完整声明的颜色fullColour的三种成分颜色:

std::array<float, 3> colourRGB;

for(unsigned i = 0; i<3; ++i) {
    colourRGB[i] = (fullColour & (0xFF << (i*8))) >> (i*8);

您可以使用它来获取开始和结束颜色的RGB数组(例如,对于示例中的红橙色范围,这将是0xFF00000xFFA200的RGB细分。然后,对于每个组件,您可以计算出“淡出”中每个步骤所需的步长。这是由该组件的总变化除以步骤总数得出的。对于红橙示例,红色分量的步长因此为1.91(因为您有86步并且总变化为(0xA2 - 0x00,或者是十进制的162,产生162/86 = 1.91)。其他组件的步长为零,因为它们不会改变。

然后,您可以迭代这些步骤,在每个步骤中添加另一个步长并进行舍入以获得每个组件的新值。例如,在步骤s

red[s] = startingRed + ((float)s * stepSizeRed)

要将rgb值重新组合成一个完整的颜色,只需再次应用一些位操作:

fullColour[s] = 0;
for(unsigned i=0; i<3; ++i)
    fullColour[s] += rgbComponent[s][i] << (i*8);

这种方法可以产生所需的“淡化”效果。从任何开始到任何结束颜色的任何数量的步骤。

答案 1 :(得分:1)

你想从红色变为黄色 接下来,黄色到绿色
接下来,绿色到浅蓝色
接下来,浅蓝色到深蓝色
接下来,深蓝色到紫色
然后回到红色。

在每次传递中,其中一种颜色为零,另一种颜色为255,而最后一种颜色增加或减少。换句话说:

255,0,0 -> 255,255,0 -> 0,255,0 -> 0,255,255 -> 0,0,255 -> 255,0,255 -> 255,0,0

可以使用以下代码完成此操作,其中色调的范围介于0.0f1.0f

之间
unsigned int rgb(double hue)
{
    int h = int(hue * 256 * 6);
    int x = h % 0x100;

    int r = 0, g = 0, b = 0;
    switch (h / 256)
    {
    case 0: r = 255; g = x;       break;
    case 1: g = 255; r = 255 - x; break;
    case 2: g = 255; b = x;       break;
    case 3: b = 255; g = 255 - x; break;
    case 4: b = 255; r = x;       break;
    case 5: r = 255; b = 255 - x; break;
    }

    return r + (g << 8) + (b << 16);
}

用法:

double range = 500;
for (double i = 0; i < range; i++)
{
    unsigned int color = rgb(i / range);
    ...
}

输出:

enter image description here