Вы можете изучить использование цветового пространства HSB. Это кажется гораздо более подходящим для того, что вы пытаетесь сделать. В частности, вы видите те углы, которые заканчиваются черными на вашем изображении «чего я хочу»? Они соответствуют «оттенкам» при 60, 180 и 300 градусах (1.0/6, 3.0/6 и 5.0/6 в Java). Белый цвет соответствует 0, 120 и 240 градусам (0, 1,0/3 и 2,0/3 в Java), и не случайно цвета под этими углами являются основными цветами (то есть два из трех компонентов RGB являются нуль).
Что вам нужно сделать, так это найти разницу между оттенком вашего цвета и ближайшим основным цветом. (Должно быть меньше 1/6.) Увеличьте его (умножьте на 6), чтобы получить значение от 0 до 1,0. Это даст вам значение «примеси», которое в основном представляет собой отклонение от ближайшего основного цвета. Конечно, это число, вычтенное из 1,0, дает вам «чистоту» или близость к основному цвету.
Вы можете создать цвет в оттенках серого на основе примеси или чистоты, используя соответствующие значения в качестве R, G и B с альфа-каналом 1,0f.
public Color getMaskColor(Color c) {
float[] hsv = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null);
float hue = hsv[0];
// 0, 1/3, and 2/3 are the primary colors. Find the closest one to c,
// by rounding c to the nearest third.
float nearestPrimaryHue = Math.round(hue * 3.0f) / 3.0f;
// difference between hue and nearestPrimaryHue <= 1/6
// Multiply by 6 to get a value between 0 and 1.0
float impurity = Math.abs(hue - nearestPrimaryHue) * 6.0f;
float purity = 1.0f - impurity;
// return a greyscale color based on the "purity"
// (for #FF0000, would return white)
// using impurity would return black instead
return new Color(purity, purity, purity, 1.0f);
}
Вы можете либо использовать цветовой компонент возвращаемого цвета в качестве значения «контрастности», либо изменить функцию так, чтобы она возвращала «чистоту» или «примесь» по мере необходимости.
Обратите внимание, что математика становится шаткой с оттенками серого. (То, как Java вычисляет HSB, чистые серые цвета - это просто красные (оттенок = 0) без оттенка (насыщенность = 0). Единственный компонент, который изменяется, - это яркость.) Но поскольку ваше цветовое колесо не имеет оттенков серого...
25.11.2012