Похоже, вы используете шестнадцатеричное значение для цветового кода? Если вы разделите шестнадцатеричное значение на три две части, у вас будет R G B.
Затем сравните компоненты R G B друг с другом. Для белого / черного цвета все они будут одинаковыми либо FFFFFF, либо 000000. Темные цвета или, по существу, черные цвета будут близки к 0, и при достаточно похожих значениях вы можете добавить дополнительную проверку, чтобы эти значения не проходили.
Например, если все они ниже 30, найдите новый номер. Кроме того, если вы заинтересованы в удалении сероватых цветов, эти цвета также будут иметь аналогичные значения RGB
А1-В2-С2 - голубовато-серый. Однако по мере приближения этих значений друг к другу они будут казаться менее насыщенными. Например. А1-В2-В2. Немного возиться с числами, и вы сможете понять, насколько они насыщенные / яркие.
Большая часть этого может быть выполнена с помощью операторов if или switch, небольшая рекурсия для повторного вызова функции и повторения поиска другого цвета, если вы хотите.
Наиболее раздражающей частью этого процесса будет преобразование в шестнадцатеричное число, получение последних двух цифр, а затем обратное преобразование в десятичное число для работы с соответствующими значениями. У кого-то еще может быть более простой подход.
x = Math.floor((Math.abs(Math.sin(delivery_id) * 16777215)) % 16777215).toString(16)
a = parseInt(x.slice(-2), 16)
b = parseInt(x.slice(2, 4), 16)
c = parseInt(x.slice(0,2),16)
Это даст вам три десятичных значения для RGB. Вы можете работать с ними в их оригинальном гексе, хотя я еще не играл с этим в Javascript. Вы можете преобразовать их обратно в hex так же, как вы уже использовали toString (16), затем объединить строку и добавить символ # в начало.
Вот пример структуры if, которую вы можете использовать:
#Check for values too close to each other (unsaturated colors)
if (Math.abs(a-b)>30 && Math.abs(a-c) > 30 && Math.abs(b-c) > 30)
{
seededColorGenerator(Math.random())
}
#check for colors that are too bright or too dark
else if ((a < 30 && b < 30 && c < 30) || (a < 225 && b < 225 && c > 225))
{
seededColorGenerator(Math.random())
}
#Assuming the color was not dark/bright or unsaturated return it.
else
{
return '#' + x.toString(16)
}