Подтвердить что ты не робот

Получите базовые цвета из набора шестигранных цветов

У меня есть набор цветов и хотелось бы разбить их на 10-20 базовых цветов.

Это не должно быть поддоном того, что передается, а не независимо от того, что передается. Поэтому, если бы изображение использовалось просто красными оттенками красного цвета, оно возвращалось бы только красным, возможно, светлым/темно-красным.

EG: у меня есть цвета, приведенные ниже, с примером вывода в виде строк. Таким образом, из 21 цветов список в этом примере составляет до 8.

enter image description here

Значения шестнадцатеричных значений выше:

#000000
#ffffff
#003e9f
#d61517
#00a7bd
#001070
#a0210c
#dc9103
#e6151e
#fdfdfd
#011171
#fbfd10
#ffc500
#fdc605
#e6141d
#faf703
#544b20
#796a3a
#7a6b3a

Конечный результат может быть чем-то вроде наружного кольца этого цветного колеса enter image description here

4b9b3361

Ответ 1

Выберите цвет base заранее и сделайте массив - вы можете использовать 12 во внешнем кольце цветного колеса. Используйте ассоциативный массив в качестве набора для вывода: для каждого цвета ввода найдите ближайший базовый цвет и добавьте его в качестве ключа к выходному массиву. Затем верните ключи этого массива.

Чтобы найти расстояние между цветами, вы можете просто рассматривать цвета как точки в трехмерном пространстве (x, y, z) = (r, g, b) и использовать евклидово расстояние. После извлечения компонентов из шестнадцатеричной строки это что-то вроде этого:

$dr = $r2 - $r1; 
$dg = $g2 - $g1; 
$db = $b2 - $b1; 
$dist = sqrt($dr * $dr + $dg * $dg + $db * $db);  

Если вы захотите, вы можете сделать что-то фантастическое, но с небольшим списком цветов, который будет просто зацикливаться на них, и найти наименьшее расстояние будет нормально работать.

Ответ 2

Я думаю, что было бы намного легче сделать (и понять), если бы вы использовали нотацию hsla.

Если ваши базовые цвета всегда одинаковы, вы можете определить 20 значений для вашего параметра оттенка (который в основном представляет собой угол от 0 ° до 360 °) и группировать все цвета, которые у вас есть, к ближайшему базовому цвету, только с оттенком.

Если ваши базовые цвета зависят от ввода (это непонятно в вашем вопросе), тогда опция @Mark Reed для определения расстояния цвета может быть выполнена также в hsl, только с оттенком, который будет более точным понятие "оттенки цвета" ИМХО.

NB: удобный инструмент для hsl: http://mothereffinghsl.com/