如何在 Java 中以彩虹顺序遍历所有 RGB 组合?

How can I loop through all RGB combinations in rainbow order in Java?

提问人:user3166950 提问时间:8/3/2015 最后编辑:user3166950 更新时间:10/23/2023 访问量:10745

问:

我正在尝试以彩虹顺序遍历所有 rgb 颜色。目前我有这个:

int state = 1;
int a = 255;
int r = 255;
int g = 0;
int b = 0;

if(g < 255 && state == 1){
    g++;
    r--;
    if(g == 255)
        state = 2;
}
if(b < 255 && state == 2){
    b++;
    g--;
    if(b == 255)
        state = 3;
}
if(state == 3){
    r++;
    b--;
    if(b == 0)
        state = 1;
}

int hex = (a << 24) + (r << 16) + (g << 8) + (b);

它有效,但它似乎没有得到所有的颜色。我知道这可能是一种糟糕的方法,是的,我知道我可以在彼此内部进行 3 个循环,但有没有人知道更好的方法来获得所有颜色?

此外,我不使用 3 个循环的原因是因为它需要在每次新的 RGB 组合后更新,而不是在循环完成后更新,因为每次都会给我带来相同的结果。

编辑: 多亏了 pbabcdefp,我让它工作,解决方案如下。

int state = 0;
int a = 255;
int r = 255;
int g = 0;
int b = 0;
if(state == 0){
    g++;
    if(g == 255)
        state = 1;
}
if(state == 1){
    r--;
    if(r == 0)
        state = 2;
}
if(state == 2){
    b++;
    if(b == 255)
        state = 3;
}
if(state == 3){
    g--;
    if(g == 0)
        state = 4;
}
if(state == 4){
    r++;
    if(r == 255)
        state = 5;
}
if(state == 5){
    b--;
    if(b == 0)
        state = 0;
}
int hex = (a << 24) + (r << 16) + (g << 8) + (b);
Java 循环 颜色 RGB

评论

8赞 biziclop 8/3/2015
我认为您应该看看色彩空间,尤其是 HSV 或 HSL 系列,它们更容易用于此目的。RGB对于平滑的色调过渡来说并不是一个很好的色彩空间。(请注意,HS* 色彩空间本身远非完美,但至少它们非常简单,您可以通过简单的循环遍历彩虹。hue
0赞 Karthik 8/3/2015
@rakeb.void 因为 .g++
0赞 user3166950 8/3/2015
@biziclop 您能否提供任何指向在 java 中实现和使用的示例的链接?会很有帮助,谢谢!
0赞 biziclop 8/3/2015
@user3166950有一个名为 getHSBColor() 的静态工厂方法,它应该可以完成这项工作。java.awt.Color
2赞 Paul Boddington 8/3/2015
你可以这样做,但应该有 6 个循环,而不是 3 个:红色->黄色->绿色->青色>蓝色->品红色->红色。

答:

0赞 Veselin Davidov 8/3/2015 #1

您需要找到所有组合。代码的问题在于,在一个循环中修改了两个值。在本例中,您将跳过一种颜色。例如,您有 G=100 和 R=100:

g++; r--; 在此行之后,G 将为 101,R 将为 99。下次将是 G102、R98 你现在有三种组合:

[G100,R100], G[101,R99], G[102,R98]。

但是你在这里错过了许多其他组合,比如 [g100,r99] 和 g[101,r100],或者 g[101,r98] 等。

0赞 Reilas 5/22/2023 #2

您可以创建一个类来保存 ARGB 值,并创建一个将值增加 1 的方法。RGB

请考虑以下类。

class RGB {
    int alpha, red, green, blue;

    void next() {
        if (blue != 255) blue++;
        else if (green != 255) green++;
        else if (red != 255) red++;
        else if (alpha != 255) alpha++;
        else throw new IndexOutOfBoundsException();
    }

    @Override
    public String toString() {
        return "%02x%02x%02x%02x".formatted(alpha, red, green, blue);
    }
}

输出示例

00000001
00000002
00000003
00000004
00000005
...
fbffffff
fcffffff
fdffffff
feffffff
ffffffff