根据十六进制颜色获取最接近的颜色名称
Get the closest color name depending on an hex-color
我尝试根据给定的十六进制值获得最匹配的颜色名称。例如,如果我们有十六进制颜色#f00
,我们必须得到颜色名称red
。
'#ff0000' => 'red'
'#000000' => 'black'
'#ffff00' => 'yellow'
我目前使用levenshtein-distance算法来获得最接近的颜色名称,到目前为止效果很好,但有时不像预期的那样。
例如:'#0769ad' => 'chocolate'
'#00aaee' => 'mediumspringgreen'
有什么办法让结果更接近吗?
下面是我为得到最接近的颜色所做的:
Array.closest = (function () {
// http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance#JavaScript
function levDist(s, t) {
if (!s.length) return t.length;
if (!t.length) return s.length;
return Math.min(
levDist(s.substring(1), t) + 1,
levDist(t.substring(1), s) + 1,
levDist(s.substring(1), t.substring(1)) + (s[0] !== t[0] ? 1 : 0)
);
}
return function (arr, str) {
// http://stackoverflow.com/q/11919065/1250044#comment16113902_11919065
return arr.sort(function (a, b) {
return levDist(a, str) - levDist(b, str);
});
};
}());
http://jsfiddle.net/ARTsinn/JUZVd/2/另一件事是性能!似乎有一个非常大的问题,使这真的很慢(是算法吗?)。
Levenshtein distance在这里并不合适,因为它会逐个字符比较是否相等。您需要分别检查每种颜色,并且您希望79
比00
更接近80
。
下面的代码似乎更接近你想要的,只需要对你的代码做最小的修改:
Array.closest = (function () {
function dist(s, t) {
if (!s.length || !t.length) return 0;
return dist(s.slice(2), t.slice(2)) +
Math.abs(parseInt(s.slice(0, 2), 16) - parseInt(t.slice(0, 2), 16));
}
return function (arr, str) {
return arr.sort(function (a, b) {
return dist(a, str) - dist(b, str);
});
};
}());
注意,只有当s
和t
都是6个字符的颜色十六进制代码时,这才会给出合理的结果。
你的代码效率很低,因为你不需要对整个数组进行排序来获得最接近的颜色。相反,您应该循环遍历数组并跟踪最短距离。
例如:Array.closest = (function () {
function dist(s, t) {
if (!s.length || !t.length) return 0;
return dist(s.slice(2), t.slice(2)) +
Math.abs(parseInt(s.slice(0, 2), 16) - parseInt(t.slice(0, 2), 16));
}
return function (arr, str) {
var min = 0xffffff;
var best, current, i;
for (i = 0; i < arr.length; i++) {
current = dist(arr[i], str)
if (current < min) {
min = current
best = arr[i];
}
}
return best;
};
}());
注意,在此更改之后,Array.closest()
将返回单个值而不是数组,因此您需要在代码中进一步删除[0]
。
相关文章:
- 获取最接近的数组数
- 从同级字符串中指定最接近的元素类
- 当使用'最接近的':jQuery
- 如何使刻度四舍五入到最接近的 # 的倍数
- 如何根据数值通过数据属性进行搜索并获得最接近的值
- 通过搜索最接近的类来更改类
- 获取TR之外最接近的隐藏值
- JQuery获取最接近的元素并筛选子元素
- 获取最接近所选选项的最快方式
- j查询树遍历从子级到最接近过滤的父级
- JavaScript:如何在最接近值的关联数组中查找键
- jquery onclick 切换最接近的 UL
- 在 javascript 数组中搜索最接近的下一个值
- 如何确定乘以后将使您最接近目标数字的数字
- 单击按钮,如何获取与类最接近的td值
- javascript代码查找最接近零的tescase
- 未获得最接近0的结果
- jQuery此语法或最接近的语法
- 以最接近的图标为目标,将其更改为另一个图标
- 根据十六进制颜色获取最接近的颜色名称