以编程方式找到颜色的补充?

时间:2010-06-16 15:42:13

标签: java colors

有没有办法在给定RGB值的情况下找到颜色的补码?或者它只能找到某些颜色?怎么会有人在Java中这样做呢?

11 个答案:

答案 0 :(得分:7)

如何计算互补色(PHP):http://www.serennu.com/colour/rgbtohsl.php

Javascript实施:JS function to calculate complementary colour?

补编

(找不到技术定义)

答案 1 :(得分:4)

使用HSL Color课程很容易补充。

答案 2 :(得分:2)

这就是我的想法:(猜想)

rgb成为原始颜色的RGB组件。

r'g'b'成为互补色的RGB组件。

然后:

r' = max(r,b,g) + min(r,b,g) - r   
b' = max(r,b,g) + min(r,b,g) - b
g' = max(r,b,g) + min(r,b,g) - g

我看到这给了网站(即www.color-hex.com)给出的相同答案,但我仍然会证明这一点。 :)

答案 3 :(得分:1)

这个问题可能有意想不到的深度,具体取决于您的需要。如果你只是想创造一些看起来或多或少像输入颜色的补充的东西,那么使用简单的数学就很简单了。如果你想让它尽可能接近(所以你在混合颜色时实际上会得到一个中性灰色),那么你需要处理色彩空间,伽玛和剩余的校准颜色混乱。

顺便说一句,我不熟悉“颜色的补充”一词 - 你是什么意思?

答案 4 :(得分:0)

上面的答案都没有真正找到一种方法来找到免费的颜色,所以这是我的版本写在Processing:

import java.awt.Color;

color initial = color(100, 0, 100);

void setup() {
  size(400, 400);  

  fill(initial);
  rect(0, 0, width/2, height);

  color opposite = getOppositeColor(initial);
  fill(opposite);
  rect(width/2, 0, width/2, height);
}

color getOppositeColor(color c) {
  float[] hsv = new float[3];
  Color.RGBtoHSB(c>>16&0xFF, c>>8&0xFF, c&0xFF, hsv);
  hsv[0] = (hsv[0] + 0.5) % 1.0;

  // black or white? return opposite
  if (hsv[2] == 0) return color(255);
  else if (hsv[2] == 1.0) return color(0);

  // low value? otherwise, adjust that too
  if (hsv[2] < 0.5) {
    hsv[2] = (hsv[2] + 0.5) % 1.0;
  }

  return Color.HSBtoRGB(hsv[0], hsv[1], hsv[2]);
}

答案 5 :(得分:0)

专注于3D RGB立方体。这是一个在该立方体中进行二分搜索的函数,以避免必须弄清楚如何在一个方向上投射矢量并找到与其相交的立方体边界上的最近点。

def farthestColorInRGBcubeFrom(color):
  def pathsAt(r, g, b):
    paths = [(r, g, b)]
    if r < 255:
        paths.append((int((r + 255)/2), g, b))
    if r > 0:
        paths.append((int(r/2), g, b))
    if g < 255:
        paths.append((r, int((g + 255)/2), b))
    if g > 0:
        paths.append((r, int(g/2), b))
    if b < 255:
        paths.append((r, g, int((b + 255)/2)))
    if b > 0:
        paths.append((r, g, int(b/2)))
    return paths                         
r = color.red();  g = color.green();  b = color.blue();
#naive guess:
r0 = 255 - r;  g0 = 255 - g;  b0 = 255 - b;
paths = pathsAt(r0, g0, b0)
maxPath = None
while paths != []:
    for p in paths:
        d = (r - p[0])**2 + (g - p[1])**2 + (b - p[0])**2
        if maxPath != None:
            if d > maxPath[0]:
                maxPath = (d, p)
        else:
            maxPath = (d, p)
    p = maxPath[1]
    paths = pathsAt(p[0], p[1], p[2])
c = maxPath[1]
return QColor(c[0], c[1], c[2], color.alpha())

答案 6 :(得分:0)

对于粗略近似,您可以通过将RGB转换为HSL(色调,饱和度,亮度)来完成此操作。

使用HSL值,将色调移动180度,以获得与色轮相反的颜色与原始值。

最后,转换回RGB。

我在这里使用十六进制值编写了一个JavaScript实现 - https://stackoverflow.com/a/37657940/4939630

对于RGB,只需将十六进制删除为RGB,将RGB转换为十六进制转换。

答案 7 :(得分:0)

您可以在以下位置找到更多信息: Programmatically choose high-contrast colors

public static int complimentaryColour(int colour) {
    return ~colour;
}

答案 8 :(得分:0)

找到相反颜色的更通用,更简单的解决方案是:

private int getComplementaryColor( int color) {
    int R = color & 255;
    int G = (color >> 8) & 255;
    int B = (color >> 16) & 255;
    int A = (color >> 24) & 255;
    R = 255 - R;
    G = 255 - G;
    B = 255 - B;
    return R + (G << 8) + ( B << 16) + ( A << 24);
}

答案 9 :(得分:0)

不,兰迪是正确的! 127和128是互补对。看起来,一对互补色是两种颜色的组合,当组合使用时会形成灰度色。 127和128本身都非常接近灰度颜色。此外,青色和红色 是互补的。

答案 10 :(得分:-2)

它应该只是数学

2种颜色的r值的总和应为255

2种颜色的g值的总和应为255

2种颜色的b值的总和应为255