Java - toString для цвета - PullRequest
       10

Java - toString для цвета

2 голосов
/ 19 апреля 2011

Я пытался решить это весь день.

По сути, я сделал цикл for, который добавляет записи в массив. Одна из записей - это переменная «Цвет». Я использовал random.nextInt для создания новых значений для красной, зеленой и синей частей конструктора цвета. Я также установил toString метод, чтобы я мог видеть значения, поступающие в массив.

Проблема:

При распечатке получаю: java.awt.Color[r=248,g=103,b=53]

и я понимаю, почему это так, мне просто интересно, как я могу это изменить, чтобы на выходе было слово «оранжевый», «зеленый» или «фиолетовый», в зависимости от того, какие случайные значения rgb.

Я посмотрел здесь и обнаружил, что мог бы использовать getRGB метод и синтаксический анализ, и вот где я застрял ... любая помощь была бы полезна:)

Ответы [ 6 ]

1 голос
/ 19 апреля 2011

Я никогда не сталкивался с тем, о чем вы просите, но сработает ли это для вас? (Вам может понадобиться добавить больше цветов для ваших нужд):

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!
1 голос
/ 19 апреля 2011

Это нетривиально и довольно субъективно.

Однако вы можете посмотреть на http://blog.xkcd.com/2010/05/03/color-survey-results/, который пытается ответить на этот вопрос.

1 голос
/ 19 апреля 2011

Вы можете создать подкласс Color, чтобы либо переопределить метод toString(), либо добавить свой собственный метод для преобразования RGB в именованный цвет. Или у вас может быть где-нибудь статический метод, который преобразует RGB в именованный цвет.

Однако, учитывая, что 256 * 256 * 256 = ~ 16 миллионов различных комбинаций RGB, большинство ваших случайных комбинаций RGB не будут соответствовать названному цвету. Так что не уверен, что это стоит делать.

1 голос
/ 19 апреля 2011

Вы можете создать подкласс Color и переопределить метод toString (или создать метод printColour или любое другое имя), а затем вы можете вывести определенную цветовую метку для определенного диапазона значений RGB.

Очевидно, что ваш выбор названий цветов и конкретный диапазон, который вы им назначаете, будет полностью субъективным.

1 голос
/ 19 апреля 2011

Этого не существует.Удачи вам в прокате - вам нужно вернуть одну из 256 x 256 x 256 (16 777 216) отдельных строк для работыКак бы вы различали все оттенки синего, например?Почему значение RGB не работает для вас?

1 голос
/ 19 апреля 2011

Вы можете создать класс, который расширяет Color и имеет строку с именем «colorName», а затем распечатать его в toString.

По умолчанию Color не хранит это имя, также трудно определить цвета посравнивая эти значения красного, зеленого и синего.

...