Когда дело доходит до программной настройки значений цвета, у вас есть много вариантов. Очень простым решением было бы просто сместить значения канала цветового объекта случайным образом. Думайте об этом как о мутирующих цветах - просто возьмите цвет, который вы хотите изменить, и сгенерируйте еще несколько цветов:
Color mutateColor(int range){
int r = a.getRed() + (int)(Math.random() * 2 * range - range);
r = Math.min(255, Math.max(0, r));
int g = a.getGreen() + (int)(Math.random() * 2 * range - range);
g = Math.min(255, Math.max(0, g));
int b = a.getBlue() + (int)(Math.random() * 2 * range - range);
b = Math.min(255, Math.max(0, b));
return new Color(r, g, b);
}
Это самый простой пример, задается диапазон, и каждый канал смещается на тот же диапазон, что приводит к чему-то вроде этого:
Это было сделано со значением диапазона 10. Для дополнительного контроля вы можете добавить три аргумента в функцию mutateColor (смещения для каждого отдельного канала). Вы также можете взять один диапазон, но изменить его на основе значений, уже имеющихся в канале. Например:
range = 0.25
red = 100
green = 10
blue = 0
redRange = 100 + rand(-25, 25)
greenRange = 10 + rand(-2.5, 2.5);
etc...
Это только одна из многих других возможностей.
Если вы хотели сравнить два цвета с допуском, я перенес код из ссылки Фредли, и он отлично работает для получения разницы между двумя цветами:
double colorDist(Color e1, Color e2){
long rmean = ( (long)e1.getRed() + (long)e2.getRed() ) / 2;
long r = (long)e1.getRed() - (long)e2.getRed();
long g = (long)e1.getGreen() - (long)e2.getGreen();
long b = (long)e1.getBlue() - (long)e2.getBlue();
return Math.sqrt((((512+rmean)*r*r)>>8) + 4*g*g + (((767-rmean)*b*b)>>8));
}