【问题标题】:Java - toString to ColourJava - toString 到颜色
【发布时间】:2011-08-08 04:57:21
【问题描述】:

我整天都在努力解决这个问题。

基本上我已经创建了一个 for 循环,它将条目添加到一个数组列表中。其中一项是“颜色”变量。我使用random.nextInt 为颜色构造函数的红色、绿色和蓝色部分创建了新值。我还设置了一个toString 方法,所以我可以看到进入数组列表的值。

问题是:

打印出来时我得到:java.awt.Color[r=248,g=103,b=53]

我明白为什么会这样,我只是想知道如何更改它,以便输出根据随机 rgb 值的不同显示“橙色”或“绿色”或“紫色”这个词。

我看了看这里,发现我可以使用getRGB 方法和解析,这就是我卡住的地方......任何帮助都会很棒:)

【问题讨论】:

标签: java colors rgb tostring


【解决方案1】:

您可以创建一个扩展 Color 并具有名为“colorName”的字符串的类,然后将其打印到 toString。

默认情况下,Color 不存储此名称,而且很难通过比较这些 Red、Green、Blue 值来识别颜色。

【讨论】:

    【解决方案2】:

    这不存在。祝你好运 - 它需要返回 256 x 256 x 256 (16,777,216) 个不同的字符串之一才能工作。例如,您将如何区分所有的蓝色阴影?为什么 RGB 值对您不起作用?

    【讨论】:

    • 我可以让 RGB 值起作用,但我想看看是否可以让名称显示。我需要做的是为每个“选举党”生成一个随机颜色,然后在数组列表中添加选票。我可能只是制作一组颜色(单词),而不是让选举方的数量不超过颜色数组列表的大小......可能更容易:P
    【解决方案3】:

    您可以继承 Color 并覆盖 toString 方法(或创建 printColour 方法或任何名称),然后您可以为特定范围的 RGB 值输出特定颜色标签。

    显然,您对颜色名称的选择以及您分配它们的具体范围将完全是主观的。

    【讨论】:

      【解决方案4】:

      您可以继承 Color 以覆盖 toString() 方法或添加您自己的另一个方法来将 RGB 转换为指定颜色。或者,您可以在某处使用静态方法将 RGB 转换为指定颜色。

      但是,鉴于有 256 * 256 * 256 =~ 1600 万种不同的 RGB 组合,您的大多数随机 RGB 组合不会对应于指定颜色。所以不确定是否值得这样做。

      【讨论】:

        【解决方案5】:

        这不是微不足道的,而是相当主观的。

        不过,您可能想查看http://blog.xkcd.com/2010/05/03/color-survey-results/,它试图回答这个问题。

        【讨论】:

          【解决方案6】:

          我从来没有真正遇到过你想要的东西,但这对你有用吗? (您可能需要add more colors 来满足您的需要):

          public final class ColorUtil {
          
              static private HashMap<String,Color> KNOWNCOLORS = new HashMap<String,Color>();
          
              static {
                  KNOWNCOLORS.put("black",     Color.black);
                  KNOWNCOLORS.put("darkgray",  Color.darkGray);
                  KNOWNCOLORS.put("lightgray", Color.lightGray);
                  KNOWNCOLORS.put("white",     Color.white);
                  KNOWNCOLORS.put("red",       Color.red);
                  KNOWNCOLORS.put("blue",      Color.blue);
                  KNOWNCOLORS.put("green",     Color.green);
                  KNOWNCOLORS.put("pink",      Color.pink);
                  KNOWNCOLORS.put("cyan",      Color.cyan);
                  KNOWNCOLORS.put("purple",    Color.magenta);
                  KNOWNCOLORS.put("orange",    Color.orange);
                  KNOWNCOLORS.put("yellow",    Color.yellow);
                  // add more here
              }
          
          
              static public String getBestColorName(Color c) {
                  int dist, diff = Integer.MAX_VALUE;
                  String colorName = toHex(c);
                  Color c2;
          
                  for (String name : KNOWNCOLORS.keySet()) {
                      c2 = KNOWNCOLORS.get(name);
                      dist = Math.abs(c.getRed() - c2.getRed())
                              + Math.abs(c.getGreen() - c2.getGreen()) 
                              + Math.abs(c.getBlue() - c2.getBlue())
                              + Math.abs(c.getAlpha() - c2.getAlpha());
          
                      if (dist < diff) {
                          diff = dist;
                          colorName = name; 
                      }
                  }
          
                  return colorName;
              }
          
              static public int getColorValue(Color c) {
                  return (c.getAlpha() << 24) 
                      | (c.getRed() << 16)
                      | (c.getGreen() << 8) 
                      | (c.getBlue()); 
              }
          
              static public String toHex(Color c) {
                  StringBuilder b = new StringBuilder();
                  if (c.getAlpha() < 255) {
                      b.append(padLeft(Integer.toString(c.getAlpha(), 16), 2));
                  }
                  b.append(padLeft(Integer.toString(c.getRed(), 16), 2));
                  b.append(padLeft(Integer.toString(c.getGreen(), 16), 2));
                  b.append(padLeft(Integer.toString(c.getBlue(), 16), 2));
          
                  return b.toString();
              }
          
              static private String padLeft(String s, int n) {
                  return String.format("%1$#" + n + "s", s).replace(" ", "0");
              }
          
              private ColorUtil() {}
          
          
          
              static public void main(String...args) {
                  Color c;
          
                  for (String name : KNOWNCOLORS.keySet()) {
                      if (!name.equals(getBestColorName(KNOWNCOLORS.get(name)))) {
                          System.out.println("*** ERR!! Could not match color " + name);
                      } 
                  }
          
                  for (int i=0; i<30; i++) {
                      c = new Color((int) (Math.random() * 256), (int) (Math.random() * 256), (int) (Math.random() * 256));
          
                      System.out.println("Color " + toHex(c) 
                           + " (" + c.getAlpha() + "," + c.getRed() + "," + c.getGreen() + "," + c.getBlue() + ")"
                           + " = " + getBestColorName(c));
                  }
          
                  System.out.println("Done!");
              }
          
          }
          

          样本输出:

          Color e75848 (255,231,88,72) = red
          Color 6f4854 (255,111,72,84) = darkgray
          Color 5dc6af (255,93,198,175) = lightgray
          Color 190971 (255,25,9,113) = darkgray
          Color 8ef300 (255,142,243,0) = yellow
          Color c2ec5b (255,194,236,91) = lightgray
          Color 998794 (255,153,135,148) = lightgray
          Color 328d06 (255,50,141,6) = darkgray
          Color 223d03 (255,34,61,3) = darkgray
          Color 51dfea (255,81,223,234) = cyan
          Color baa801 (255,186,168,1) = orange
          Color 8370d4 (255,131,112,212) = lightgray
          Color 7766bd (255,119,102,189) = lightgray
          Color 35024b (255,53,2,75) = darkgray
          Color cdbfad (255,205,191,173) = lightgray
          Color 5e3a21 (255,94,58,33) = darkgray
          Color 11af5d (255,17,175,93) = darkgray
          Color 480995 (255,72,9,149) = darkgray
          Color 04adab (255,4,173,171) = cyan
          Color 98641c (255,152,100,28) = darkgray
          Color 3ef68c (255,62,246,140) = cyan
          Color 4d091a (255,77,9,26) = darkgray
          Color 56117d (255,86,17,125) = darkgray
          Color 1a00ea (255,26,0,234) = blue
          Color 2ffd3e (255,47,253,62) = green
          Color 9a918b (255,154,145,139) = lightgray
          Color 6f8f0e (255,111,143,14) = darkgray
          Color 5f3e25 (255,95,62,37) = darkgray
          Color 914e79 (255,145,78,121) = darkgray
          Color 57f88b (255,87,248,139) = cyan
          Done!
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-04-29
            • 1970-01-01
            • 2021-04-03
            • 1970-01-01
            • 2016-11-04
            • 1970-01-01
            • 2011-11-22
            相关资源
            最近更新 更多