Получите базовые цвета из набора шестигранных цветов
У меня есть набор цветов и хотелось бы разбить их на 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]()
Ответы
Ответ 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/