【问题标题】:Programmatically find complement of colors?以编程方式查找补色?
【发布时间】:2010-06-16 15:42:12
【问题描述】:

有没有办法在给定 RGB 值的情况下找到颜色的补色?还是只能找到某些颜色?有人会如何在 Java 中做到这一点?

【问题讨论】:

  • 定义补色/补充色。如果补色和补色总是相对于输入颜色(取决于您的定义),那应该很容易。我在网上看到它是用 Javascript 完成的,我只是不记得名称或 URL。
  • 更新:我找到了! colorschemedesigner.com它不做补色,但有一大堆其他选择。
  • 补充很容易使用HSL Color类。

标签: java colors


【解决方案1】:

这是我想出来的:(猜想)

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)给出的答案相同,但我仍会证明这一点。 :)

【讨论】:

  • 这会将红色与青色配对。
【解决方案2】:

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

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);
}

【讨论】:

    【解决方案3】:

    上面的答案都没有真正提供找到互补色的方法,所以这是我用 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]);
    }
    

    【讨论】:

      【解决方案4】:

      只关注 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())
      

      【讨论】:

        【解决方案5】:

        对于粗略的近似,您可以通过将 RGB 转换为 HSL(色相、饱和度、亮度)来做到这一点。

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

        最后,转换回 RGB。

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

        对于 RGB,只需删除十六进制到 RGB 和 RGB 到十六进制的转换。

        【讨论】:

          【解决方案6】:

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

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

          【讨论】:

            【解决方案7】:

            应该只是数学

            两种颜色的r值之和应该是255

            两种颜色的g值之和应该是255

            两种颜色的b值总和应该是255

            【讨论】:

            • 这将导致例如红色与青色而不是绿色配对。
            • 更糟糕的是,127,127,127 会与 128,128,128 配对
            猜你喜欢
            • 2010-12-16
            • 2012-03-26
            • 1970-01-01
            • 1970-01-01
            • 2011-12-04
            • 2011-04-22
            • 2014-04-18
            • 2019-04-17
            • 1970-01-01
            相关资源
            最近更新 更多