Я думаю, вам стоит взглянуть на HSL / HSV вместо RGB.
Хотя RGB по своей природе элементарен в том смысле, что он выражает цвета в терминах основных цветов, он не позволяет вносить «понятные» изменения в значения R, G или B для получения «похожих» цветов. С моделью HSL / HSV вы сможете вносить изменения в яркость / яркость / значение (L / V), чтобы получить цвета с различным количеством серого, или вносить изменения в оттенок (H) для получения похожих цветов по всему спектру. , Вы можете начать с полной яркости (белый) и создавать более темные оттенки серого, уменьшив значение L / V и в конечном итоге достигнув цвета без яркости (черный).
Очень мягкое введение в теорию цвета, для разработчиков доступно здесь .
Что касается вашего вопроса, вы должны выразить свои цвета в терминах HSL, с увеличением значения насыщенности, чтобы иметь диапазон цветов, начиная от белого до черного. Конечно, если вам нужны серые тона между белым и черным без какого-либо другого цвета, вам следует сохранить минимальный оттенок.
Ниже приведен короткий пример получения диапазона цветов. Для краткости я заполнил цвета в массив, но это не обязательно, так как вы можете использовать правильный цвет (помимо учета требований к памяти).
private Color[] produceColorRange(int steps)
{
float value = 1.0f; //Starting with full brightness
Color[] colors = new Color[steps];
for(int ctr = 0; ctr < steps; ctr++)
{
value = value - (1.0f/steps); //tend to darkness
int rgb = Color.HSBtoRGB(0.7f, 0.0f, value); //create a darker color
//Hue is Blue, not noticeable
//because Saturation is 0
Color color = new Color(rgb);
colors[ctr] = color;
}
return colors;
}
Если вы используете описанный выше метод и нарисуете JFrame, вы сможете получить результат, аналогичный приведенному ниже (за исключением того, что я изменил оттенок и насыщенность, чтобы получить свой диапазон цветов).
Обратите внимание: если вы хотите получить более простой способ получения цветового диапазона, инициализируйте объект Color с помощью Color.WHITE и вызовите color.darker (). Конечно, вы не сможете контролировать приращение.