根据十六进制颜色获取最接近的颜色名称

2023-11-25

我尝试根据给定的十六进制值获取最匹配的颜色名称。例如,如果我们有十六进制颜色#f00我们必须得到颜色名称red.

'#ff0000' => 'red'
'#000000' => 'black'
'#ffff00' => 'yellow'

我目前使用编辑距离算法来获取最接近的颜色名称,到目前为止效果很好,但有时不如预期。

例如:

'#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/

还有一点就是表演!似乎某个地方存在一个非常大的问题,导致速度非常慢(是算法吗?)。


编辑距离在这里并不合适,因为它会逐个字符地比较是否相等。您需要分别检查每种颜色,并且您想要79更接近80 than 00.

以下内容似乎更接近您想要的内容,只需对代码进行很少的更改:

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 and 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]在你的代码中进一步。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据十六进制颜色获取最接近的颜色名称 的相关文章

随机推荐

  • any() 是否被延迟评估?

    我正在编写一个脚本 其中我必须根据多种条件测试数字 如果any满足我想要返回的条件True我想以最快的方式做到这一点 我的第一个想法是使用any 而不是嵌套if语句或多个or链接我的条件 因为如果有任何一个条件满足的话我会很满意True我真
  • 如何防止默认复选框事件覆盖我的 jQuery 检查/取消选中功能?

    我在表格内有一个复选框列表 其中包含一个简单的 jQuery 函数 该函数允许用户单击表格行中的任意位置来选中 取消选中复选框 它工作得很好 除非用户实际单击该复选框 那就不行了 有任何想法吗 这是我的代码 HTML tr tr jQuer
  • Google Codejam 亚太地区测试练习轮:括号顺序

    我花了一天时间解决这个问题并且找不到传递大型数据集的解决方案 Problem n 个括号序列由 n 个 和 n 个 组成 现在 我们有了所有有效的 n 个括号序列 找到第 k 个最小的序列词典编纂的 order 例如 以下是按字典顺序排列的
  • 在 Hibernate 之前运行 SpringLiquibase

    我正在使用 SpringLiquibase 在应用程序启动期间自动应用 liquibase 更新 一般来说 这工作正常 但是当我将 hibernate hbm2ddl auto 设置为 验证 时 hibernate 开始抱怨数据库方案 然后
  • 打印整数或带有 n 位小数的浮点数

    在Python中 当后一种情况需要我将打印输出限制为一定数量的数字时 如何打印可能是整数或实数类型的数字 长话短说 假设我们有以下示例 print 0 3f format num I cannot do print format num b
  • 在 EMACS org.mode 中覆盖 Ctrl-TAB

    I would like to use Ctrl Tab in EMACS for my own use but Emacs org mode already has this bound How can I use my own bind
  • 有没有办法在 Rails 中搭建单例资源?

    如果您正在使用单一资源 则常规的脚手架方式不起作用 有什么方法可以通过脚手架获取默认的单一控制器吗 假设如果用户只有一个帖子 是否可以简单地运行如下命令 rails g scaffold post singular 当您查看 Rails 3
  • 无法定义依赖 typedef 的成员

    我正在编写自定义惰性字符串类 template
  • 像 HTML 表格一样使用 CSS/Div 设计页面布局

    由于我是 CSS 新手 我不确定是否可以使用 Div CSS 进行以下页面布局 或者我应该使用 HTML 表格吗 我想设计我的页面 使得左侧 即大约 30 分为 3 个带有一定边距的部分 即一列和 3 行 页面的其余部分分为 2 行 即一列
  • 更改 WordPress 中的“POST”类型 slug

    默认的 WordPress 带有一个默认的帖子类型 带有 post 的标签 我想把这个蛞蝓换成另一个 而不会有任何头痛 我的意思是 例如 改变子弹post to article 我怎样才能做到这一点 Update 这就是我要的 functi
  • 不要转义存储为字符串的 html(执行或处理 html 字符串)[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 在PHP Wordpress主题功能 尝试将主题选项中存储的html添加到博客标题 中
  • 在 Swift 中输入文本字段中的货币格式

    我正在尝试在用户输入时格式化 Swift 文本字段中的货币输入 到目前为止 我只能在用户输入完成后才能成功格式化 IBAction func editingEnded sender AnyObject let formatter NSNum
  • 如何修复 Java 13 和 Spring 的 Maven 中不支持的类文件主要版本 57

    我有这个错误 如何修复它 Caused by java lang IllegalArgumentException Unsupported class file major version 57 我有这样的POM
  • Python检查网站是否存在

    我想检查某个网站是否存在 这就是我正在做的 user agent Mozilla 20 0 1 compatible MSIE 5 5 Windows NT headers User Agent user agent link http w
  • 如何使用 PyQt 根据屏幕分辨率调整主窗口的大小

    我有一个带有三个框架的主窗口 顶部框架由页眉组成 底部框架由页脚组成 我设计它使用PyQt4设计师 当我在笔记本电脑上运行它时 窗口看起来很好 屏幕分辨率为1920 1080 但是当我在其他分辨率上检查相同的内容时 例如1600 900页脚
  • 如何使用 Kivy (Python) 相机

    我尝试使用 uix camera 小部件并从我的网络摄像头显示一些 Wideo 我查看了文档并尝试使用这个简单的代码 但它只是向我显示一个白色屏幕 没有任何视频 我启用了播放 我做错了什么 也许存在一些有用的文档 教程 因为从官方文档中我了
  • 在 ES6 中调用 import 后立即执行模块[重复]

    这个问题在这里已经有答案了 我正在 NodeJS 上做一些事情 我正在使用importES6 语法中的关键字 我想在调用它后立即执行 我搜索了类似的想法来做到这一点 但没有什么足够的帮助 我想做的基本上是将以下代码从 CommonJS 转换
  • 如何逃脱并进入scp

    是的 我确实意识到它已经被问过一千次如何逃脱spaces在 scp 中 但我无法做到这一点 sign 如果该符号是目录名称的一部分 sorunome sorunome desktop tmp scp test txt bpi home so
  • 获取循环时“异步事件循环已关闭”

    当尝试运行文档中给出的 asyncio hello world 代码示例时 import asyncio async def hello world print Hello World loop asyncio get event loop
  • 根据十六进制颜色获取最接近的颜色名称

    我尝试根据给定的十六进制值获取最匹配的颜色名称 例如 如果我们有十六进制颜色 f00我们必须得到颜色名称red ff0000 gt red 000000 gt black ffff00 gt yellow 我目前使用编辑距离算法来获取最接近