Я рекомендую использовать https://www.npmjs.com/package/fluent-ffmpeg для вызова ffmpeg из Node.js
Каждый цвет представлен в виде кортежа в HEX-коде. Чтобы определить близкие совпадения, вам нужно вычесть каждый компонент RGB отдельно.
Пример:
Color 1: #112233
Color 2: #122334
Color 3: #000000
Difference between color1 and color2: R=1, G=1 B=1 = 0x3
Difference between color3 and color1: R=11, G=22, B=33 = 0x66
So color 1 and color 2 are closer than
1 and 3.
edit
Итак, вам нужен ближайший именованный цвет? Создайте массив с шестнадцатеричными значениями каждого цвета, повторите его и верните имя. Примерно так:
function getColor($rgb)
{
// these are not the actual rgb values
$colors = array(BLUE =>0xFFEEBB, RED => 0x103ABD, GREEN => 0x123456);
$largestDiff = 0;
$closestColor = "";
foreach ($colors as $name => $rgbColor)
{
if (colorDiff($rgbColor,$rgb) > $largestDiff)
{
$largestDiff = colorDiff($rgbColor,$rgb);
$closestColor = $name;
}
}
return $closestColor;
}
function colorDiff($rgb1,$rgb2)
{
// do the math on each tuple
// could use bitwise operates more efficiently but just do strings for now.
$red1 = hexdec(substr($rgb1,0,2));
$green1 = hexdec(substr($rgb1,2,2));
$blue1 = hexdec(substr($rgb1,4,2));
$red2 = hexdec(substr($rgb2,0,2));
$green2 = hexdec(substr($rgb2,2,2));
$blue2 = hexdec(substr($rgb2,4,2));
return abs($red1 - $red2) + abs($green1 - $green2) + abs($blue1 - $blue2) ;
}
Вот статья на тему , которая должна дать хороший ответ.
Я думал, что сначала было бы неплохо преобразовать в HSL / HSV, но потом я понял, что при экстремальных значениях S & L / V H не имеет значения, а в середине имеет наибольшее значение.
Я думаю, если вам нужно простое решение, разумнее будет оставаться в пространстве RGB. Я бы использовал декартово расстояние. Если вы рассматриваете цвет RGB
против Ri Gi Bi
для нескольких i
, вам нужен i
, который минимизирует
(R - Ri)^2 + (G - Gi)^2 + (B - Bi)^2
Сначала вы должны выбрать соответствующее цветовое пространство, в котором вы хотите проводить сравнения цветов (RGB, HSV, HSL, CMYK и т. Д.).
Предполагая, что вы хотите знать, насколько близко две точки в трехмерном пространстве RGB расположены друг относительно друга, вы можете вычислить расстояние между ними по Пифагору, то есть
d2 = (r1 - r2)**2 + (g1 - g2)**2 + (b1 - b2)**2;
Это фактически дает вам квадрат расстояния. (В извлечении квадратного корня нет необходимости, если вы сравниваете только квадраты значений.)
Это предполагает, что вы хотите одинаково обрабатывать значения R, G и B. Если вы предпочитаете взвешивать отдельные цветовые компоненты, например, что происходит при преобразовании RGB в оттенки серого, вы должны добавить коэффициент к каждому члену расстояния, то есть
d2 = 30*(r1-r2)**2 + 59*(g1-g2)**2 + 11*(b1-b2)**2;
Это предполагает популярное преобразование из RGB в градации серого 30% красный + 59% зеленый + 11% синий.
Обновление
Последнее уравнение, вероятно, должно быть
d2 = (30*(r1-r2))**2 + (59*(g1-g2))**2 + (11*(b1-b2))**2;
Очень простой подход - вычислить суммарное расстояние между тремя измерениями. Например, simple_distance («12,10,255», «10,10,250») = 7
Более сложный подход состоит в том, чтобы взять квадрат расстояний для каждого компонента и просуммировать их - в этом случае компоненты, расположенные слишком далеко, будут: наказано "more: square_distance (" 12,10,255 "," 10,10,250 ") = 2 * 2 + 0 * 0 + 5 * 5 = 29.
Конечно, вам придется перебирать список цветов и находить ближайший.
вы можете преобразовать значение RGB в HSL или HSV. тогда цвета легко сравнивать: сначала отсортируйте цвета по оттенку, затем по насыщенности, а затем по яркости. в результирующем порядке 2 цвета рядом друг с другом будут казаться очень близкими по восприятию.
будьте осторожны, чтобы оттенок обтекал: для оттенка от 0 до 255, оттенок 0 и оттенок 255 очень близки.
см. Статью в Википедии о HSL http://en.wikipedia.org/wiki/HSL_and_HSV , чтобы узнать о формуле, которая позволит вам преобразовать RGB в HSL
(обратите внимание, что другие цветовые пространства, как Lab, может дать лучшие результаты, но преобразование более сложное)
давайте определим это математически:
distance(A(h,s,l), B(h,s,l)) = (A(h)-B(h)) * F^2 + (A(s)-B(s)) * F + (A(l)-B(l))
где F - тщательно выбранный коэффициент (что-то вроде 256 ...)
приведенная выше формула не учитывает учитывать оттенок, охватывающий ...