滚动浏览 RGB 颜色效果

Scrolling through colors effect in RGB

我想创建一个彩色滚动条效果。我有一个函数,我给它 RGB 值(例如 setColor(189,234,45)),我想快速改变颜色,但我不想重复多次以产生滚动颜色的效果。

我尝试了以下方法,但它并没有产生我想要的效果。

for (int i = 0; i < 256; i++) {
    for (int j = 0; j < 256; j++) {
      for (int k = 0; k < 256; k++) {
        setColor(i, j, k);
      }
    }
  }

我想知道是否有人知道彩色卷轴的颜色是如何相邻排列的。我正在寻找的安排看起来像 scroll on the right.

正如您在编辑中提到的,您不喜欢颜色的顺序,因为您是从黑色开始到白色结束,而不是从彩虹的一端开始到另一端。

因此,您将需要计算出从蓝色到绿色、从黄色到红色的 RGB 序列。这意味着您需要从 (0,0,255) 开始并在 (255, 0, 0) 结束,并且不要通过 (255,255,255) 或 (0,0,0) - 简而言之,这就是它的完成方式。

有很多方法可以做到这一点并获得令人满意的效果 - 超出了此处的答案范围。本文深入探讨:

http://krazydad.com/tutorials/makecolors.php

您正在使用的颜色表示为 R、G、B(红绿蓝)值。然而,另一个 思考颜色的方式是色相、饱和度、明度。在您尝试模拟的滚动图像中, 变化的是色调 - 饱和度和明度(亮度)不受影响。

这是一个函数,它恰好可以像您链接到的图像中的那样制作色调循环渐变:

int n = 256; // number of steps
float TWO_PI = 3.14159*2;

for (int i = 0; i < n; ++i) {
    int red = 128 + sin(i*TWO_PI/n + 0) + 127;
    int grn = 128 + sin(i*TWO_PI/n + TWO_PI/3) + 127;
    int blu = 128 + sin(i*TWO_PI/n + 2*TWO_PI/3) + 127;
    setColor(red, grn, blu);
}

要了解该功能的工作原理,我建议您阅读我的 color tutorial 链接到的 GreenAsJade。

但是,这种渐变函数并不是您所需要的,因为您希望从传入的特定颜色开始,然后转到序列中的下一个颜色。如果将颜色表示为 HSV 三元组(或 HSB 三元组)而不是 RGB 三元组,则执行此类操作会容易得多。然后你可以只操纵色调组件,并获得那种彩虹效果。有助于拥有一组可以从 RGB 转换为 HSV 并再次转换回来的功能。

This site 包含一堆颜色转换源代码,包括你需要的那些转换。使用该页面上提供的两个转换函数,您的代码可能如下所示:

void cycleMyColor(int *r, int *g, int *b) {
    float h,s,v,  fr,fg,fb;
    RGBtoHSV(*r/255.0,*g/255.0,*b/255.0,&h,&s,&v);
    h += 1/256.0;  // increment the hue here
    h -= (int) h;  // and cycle around if necessary
    HSVtoRGB(&fr,&fg,&fb,h,s,v);
    *r = fr*255; *g = fg*255; *b = fb*255;
    setColor(*r,*g,*b);
}

此代码比实际需要的要复杂一些,因为该站点上的颜色转换使用从 0-1 的浮点颜色分量,而不是像您使用的那样从 0-255 的整数,所以我花了几行代码在这两种表示之间进行转换。您可能会发现将颜色保留为 HSB space,然后在需要显示时转换为 RGB 更简单。