Java中的颜色类

问题描述 投票:0回答:4

我对Java中的awt Color类有疑问。

我目前正在使用类缩写,例如Color.REDColor.BLACK。我还有一个三个整数的列表,如下所示:

int var1 = 0
int var2 = 0
int var3 = 255

有没有方法将这些整数转换为适当的Java Color名称?

java awt
4个回答
2
投票

使用Java核心类中的单个方法无法实现此目的。但是,您可以通过两种方式轻松地完成此操作。

First way

使用您拥有的RGB值创建一个新的Color

Color color = new Color(var1, var2, var3);

然后

  1. 使用ClassColor类中获取getClass()对象。
  2. 使用getEnumConstants()从中获取元素。
  3. 使用Arrays.stream()流式传输
  4. 通过调用filter()来过滤它,因此它只包含所有与你所做的颜色相等的枚举常量(应该有一个或零)。
  5. 使用toArray()将流转换为数组。
  6. 使用[0]获取该数组的第一个元素。如果没有与您的颜色匹配的预定义颜色,这将抛出ArrayIndexOutOfBoundsException
  7. EnumtoString()获取该颜色的名称。
String colorName = Arrays.stream(Color.getClass().getEnumConstants())
                         .filter(c -> c.equals(color))
                         .toArray()[0]
                         .toString();

Second way

首先,创建一个HashMapColors,其中包含您想要的所有颜色:

HashMap<Color, String> colors = new HashMap<Color, String>();

colors.put(Color.BLACK,            "BLACK");
colors.put(Color.BLUE,             "BLUE");
colors.put(Color.CYAN,             "CYAN");
colors.put(Color.DARK_GRAY,        "DARK_GRAY");
colors.put(Color.GRAY,             "GRAY");
colors.put(Color.GREEN,            "GREEN");
colors.put(Color.LIGHT_GRAY,       "LIGHT_GRAY");
colors.put(Color.MAGENTA,          "MAGENTA");
colors.put(Color.ORANGE,           "ORANGE");
colors.put(Color.PINK,             "PINK");
colors.put(Color.RED,              "RED");
colors.put(Color.WHITE,            "WHITE");
colors.put(new Color(192, 0, 255), "PURPLE");
colors.put(new Color(0xBADA55),    "BADASS_GREEN");
colors.put(new Color(0, 0, 128),   "DARK_BLUE");

然后,从您拥有的RGB值中创建一个新的Color

Color color = new Color(var1, var2, var3);

最后,get colors中关键color的值:

String colorName = colors.get(color);

0
投票

据我所知,我们没有任何这样的库可以直接访问常量中的颜色。

但我们可以使用Java中的Hex Color Library来管理它。

参考文献:

  1. Hex
  2. Color Class

0
投票

这种行为没有设置函数,但你可以这样做:

public static String getColorName(int r, int g, int b) {
    String[] colorNames = new String[] {
            "BLACK",
            "BLUE",
            "GREEN",
            "CYAN",
            "DARK_GRAY",
            "GRAY",
            "LIGHT_GRAY",
            "MAGENTA",
            "ORANGE",
            "PINK",
            "RED",
            "WHITE",
            "YELLOW"
    };
    Color userProvidedColor = new Color(r,g,b);
    Color color;
    Field field;
    for (String colorName : colorNames) {
        try {
            field = Class.forName("java.awt.Color").getField(colorName);
            color = (Color)field.get(null);
            if (color.equals(userProvidedColor)) {
                return colorName; // Or maybe return colorName.toLowerCase() for aesthetics
            }
        } catch (Exception e) {

        }
    }
    Color someOtherCustomDefinedColorMaybePurple = new Color(128,0,128);
    if (someOtherCustomDefinedColorMaybePurple.equals(userProvidedColor)) {
        return "Purple";
    }
    return "Undefined";
}

这里有一些选项,也许你想要最近的颜色?在这种情况下,你可以尝试以某种方式解决距离(这里距离每个r,g,b坐标,不可否认,这不是最好的方法,但对于这个例子来说很简单,this wiki page has a good discussion on more rigorous methods

// ...
String minColorName = "";
float minColorDistance = 10000000;
float thisColorDistance = -1;
for (String colorName : colorNames) {
    try {
        field = Class.forName("java.awt.Color").getField(colorName);
        color = (Color)field.get(null);
        thisColorDistance = ( Math.abs(color.red - userProvidedColor.red) + Math.abs(color.green - userProvidedColor.green) + Math.abs(color.blue - userProvidedColor.blue) );
        if (thisColorDistance < minColorDistance) {
            minColorName = colorName;
            minColorDistance = thisColorDistance;
        }
    } catch (Exception e) {
        // exception that should only be raised in the case color name is not defined, which shouldnt happen
    }
}
if (minColorName.length > 0) {
    return minColorName;
}
// Tests on other custom defined colors

这应该概述了如何与Color库中的内置颜色进行比较。您可以使用Map进一步扩展功能,以便您可以根据需要定义任意数量的自定义颜色(@TheGuywithTheHat建议的东西),它可以让您更好地控制匹配颜色的返回名称,并允许您通过比预定义的颜色更多的颜色:

HashMap<String,Color> colorMap = new HashMap<String,Color>();

colorMap.put("Red",Color.RED);
colorMap.put("Purple",new Color(128,0,128));
colorMap.put("Some crazy name for a color", new Color(50,199,173));
// etc ...

String colorName;
Color color;
for (Map.Entry<String, Color> entry : colorMap.entrySet()) {
    colorName = entry.getKey();
    color= entry.getValue();
    // Testing against users color
}

0
投票

没有任何帮助库我会说:不。特别是因为不是每个RGB颜色都有一个特定的名称。但是,你当然可以构建一个自己的函数,它试图匹配一些可用的颜色,并在没有匹配时提供类似“未知”的东西。

理论上可以使用Java反射API完成匹配尝试...

© www.soinside.com 2019 - 2024. All rights reserved.