Цветовой детектор на Java - PullRequest
       2

Цветовой детектор на Java

1 голос
/ 22 февраля 2012

У меня есть список цветов в формате HEX (например, # 000000), и я хотел бы определить тип цвета (синий, красный, зеленый и т. Д.), А затем изменить тип цвета на другой тип цвета. Возможно ли это, и есть ли какие-либо фреймворки / библиотеки для этой задачи?

Пример:

У меня есть цвет # EB1369 (красный), затем я преобразую его в синий, и он становится, например, # 1313EB (синий).

Ответы [ 4 ]

1 голос
/ 22 февраля 2012

Вот функция, которая позволит вам смещать цвета вокруг круга оттенка. Вы должны прочитать страницу википедии по цветовой системе HSB (или HSV), чтобы действительно понять, что происходит: http://en.wikipedia.org/wiki/HSV_color_space

/** Converts an input color given as a String such as "ab451e" to
 * the HSB color space. Shifts its hue from the given angle in degrees. 
 * Then returns the new color in the same format it was given.
 * 
 *  For example shift("ff0000", 180); returns "80ff00" (green is the opposite of red).*/
public static String shift(String rgbS, int angle) {        
    // Convert String to integer value
    int value = Integer.parseInt(rgbS, 16);

    // Separate red green and blue
    int r = value >> 16;
    int g = (value >> 8) & 0xff;
    int b = value & 0xff;

    // Convert to hsb
    float[] hsb = Color.RGBtoHSB(r, g, b, null);

    // Convert angle to floating point between 0 and 1.0
    float angleF = (float)(angle/360.0);

    // Shift the hue using the angle.
    float newAngle = hsb[0] + angleF;
    if(newAngle > 1.0)
        newAngle = newAngle - 1.0f;
    hsb[0] = newAngle;

    // Convert back to RGB, removing the alpha component
    int rgb = Color.HSBtoRGB(hsb[0], hsb[1], hsb[2]);
    rgb = rgb & 0xffffff;

    // Build a new String
    return Integer.toHexString(rgb);
}

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

Если вы хотите просто приблизительное значение (красное, зеленое, синее, желтое и т. Д.), То вы можете посмотреть на круг оттенков цветового пространства HSB, выбрать значение оттенка для каждого цвета, который вы хотите определить, и затем сопоставьте цвет, который вы получаете на входе, с ближайшим, который вы выбрали.

Вы также можете положиться на такие вещи, как именованные цвета HTML: http://www.w3schools.com/html/html_colornames.asp. Возьмите этот список, создайте отображение в вашей программе, затем все, что вам нужно сделать, это сопоставить цвет, который вы получаете, с ближайшим на вашей карте и вернуть его имя. Однако будьте осторожны: вычисление расстояния между двумя цветами может быть сложным (особенно в RGB), а наивные подходы (такие как различие между каналами) могут дать неожиданно плохие результаты. Колориметрия - сложная тема, и на этой странице вы найдете хорошие методы: http://en.wikipedia.org/wiki/Color_difference

1 голос
/ 22 февраля 2012

Попробуйте преобразовать значения RGB в HSV (точно HSB) - это формат для цветов, более удобный для человека.После преобразования все, что вам нужно сделать, это изменить H V (вероятно) и преобразовать его обратно в RGB.

0 голосов
/ 22 февраля 2012

Каждый цвет HEX состоит из трех частей: красного, зеленого и синего. # обозначает цвет HEX, следующие две буквы обозначают количество красного;следующие два - зеленые, а следующие два - синие.т.е.: RGB

Две буквы могут иметь максимальное шестнадцатеричное значение FF, равное 255, и минимальное значение 00, равное нулю.

Таким образом, вы можете утверждать, чтоэто, я хочу цвет с 2 красными частями, 7 зелеными частями и нулевыми синими частями, что даст вам #020700

Именно поэтому #FFFFFF - это белый (все цвета вместе) и #000000 черный (вообще без цветов)

С помощью этой логики вы можете изменять цвет любым удобным вам способом;Класс Color также может сильно помочь.

0 голосов
/ 22 февраля 2012

Полагаю, вам нравится конвертировать цвет RGB в HSB. Вы можете сделать это:

java.awt.Color.RGBtoHSB(...)

тогда вы можете легко определить, соответствует ли значение H вашему определению синего цвета, и изменить его так, как вам нравится. После этого вы можете легко преобразовать его обратно в RGB с помощью:

java.awt.Color.getHSBColor(...)

И если вам не нравится jawa.awt.color, просто умножьте цветовой вектор на матрицу преобразования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...