Вот функция, которая позволит вам смещать цвета вокруг круга оттенка. Вы должны прочитать страницу википедии по цветовой системе 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