Раз уж вопрос в теге "алгоритмы", то опишу такой алгоритм:
1. Цвета в RGB кодируются тремя числами, каждое из которых обозначает интенсивность какого-то компонента.
Красного, Зелёного, и Синего соответственно.
2. В показанном шестнадцатеричном формате для этого используется 6 шестнадцатеричных цифр, где для каждого компонента в том же порядке используется по две цифры. При переводе в десятичную систему - это будет значение от 0 до 255.
3. Самый простой алгоритм - представить цвет как точку в трёхмерной системе координат, и находить ближайшую из заранее известных точек к данной.
Вот наивное решение с полным перебором и без учёта оттенков (псевдокод)
В теории, если цветов достаточно много, то найдёт действительно ближайший цвет, а не дичь какую-то.
struct Color(red: u8, green: u8, blue: u8);
type ColorName = String;
let KNOWN_COLORS: Map<Color, ColorName> = Map {...};
fn get_nearest_known_color_name(color: Color) -> ColorName {
if KNOWN_COLORS.has(color) {
return KNOWN_COLORS.get(color);
}
var (nearest_color, nearest_color_name) = KNOWN_COLORS.first();
var distance = calculate_distance(nearest_color, color);
for (key, value) of KNOWN_COLORS.skip(1) {
var distance = calculate_distance(key, color);
if distance < distance_to_nearest {
distance_to_nearest = distance;
nearest_color = key;
nearest_color_name = value;
}
}
return nearest_color_name;
}
fn calculate_distance(lhs: Color, rhs: Color) -> f64 {
var r = lhs.red - rhs.red;
var g = lhs.green - rhs.green;
var b = lhs.blue - rhs.blue; // вычитаем один вектор из другого
return sqrt(r^2+g^2+b^2); // считаем длину получившегося вектора по теореме пифагора
}
Всё что тебе остаётся - вместо строк использовать числа.
PS: об HSV даже и не подумал.