按颜色排序

2024-01-25

我有一长串(1000+)十六进制颜色,分为一般颜色类别(红色、橙色、蓝色等)。当我显示每个类别中的颜色列表时,我需要按颜色顺序显示它们。即先浅红色,最后深红色。

执行此操作的算法是什么? (谷歌搜索让我失败了)


我知道这个问题很老了,但是我没有找到解决这个问题的好方法,所以我做了一些调查,并想分享我为假设的未来谷歌用户所做的事情。

首先,转换为 HSL 是个好主意。但是,当您的颜色未“分类”时,仅按色调或光线排序并不能完全解决问题。

给定一个如下所示的数组:

$colors = [
            [ 'color' => '#FDD4CD'],
            [ 'color' => '#AE3B3B'],
            [ 'color' => '#DB62A0'],
            ...
          ]

首先我们将所有十六进制颜色转换为 HSL

foreach ($colors as &$color) {
       $color['hsl'] = hexToHsl($color['color']);
}


/**
 * Convert a hexadecimal color in RGB
 * @param string $hex
 * @return array
 */
function hexToHsl($hex){
    list($r, $g, $b) = sscanf($hex, "#%02x%02x%02x");
    return rgbToHsl($r, $g, $b);
}

/**
 * Convert a RGB color in its HSL value
 * @param int $r red
 * @param int $g green
 * @param int $b blue
 * @return array
 */
function rgbToHsl($r, $g, $b)
{
    $r /= 255;
    $g /= 255;
    $b /= 255;

    $max = max($r, $g, $b);
    $min = min($r, $g, $b);

    $h = 0;
    $l = ($max + $min) / 2;
    $d = $max - $min;

    if ($d == 0) {
        $h = $s = 0; // achromatic
    } else {
        $s = $d / (1 - abs(2 * $l - 1));

        switch ($max) {
            case $r:
                $h = 60 * fmod((($g - $b) / $d), 6);
                if ($b > $g) {
                    $h += 360;
                }
                break;

            case $g:
                $h = 60 * (($b - $r) / $d + 2);
                break;

            case $b:
                $h = 60 * (($r - $g) / $d + 4);
                break;
        }
    }
    return array('h' => round($h, 2), 's' => round($s, 2), 'l' => round($l, 2));
}

然后对颜色进行排序

我们比较:

  • 如果它们处于相同的“区间”,则它们的色调(这有助于理解为什么我选择 30° http://www.december.com/html/spec/colorhslhex.html)。因此,只有当两者都在 [0-30]、[30-60]、[60-90]、... 范围内时,我们才会比较色调
  • 如果不在同一区间,则按亮度排序,如果两者具有相同的亮度,则按饱和度排序。

So:

usort($colors, function ($a, $b) {
    //Compare the hue when they are in the same "range"
    if(!huesAreinSameInterval($a['hsl']['h'],$b['hsl']['h'])){
       if ($a['hsl']['h'] < $b['hsl']['h'])
           return -1;
       if ($a['hsl']['h'] > $b['hsl']['h'])
           return 1;
    }
    if ($a['hsl']['l'] < $b['hsl']['l'])
        return 1;
    if ($a['hsl']['l'] > $b['hsl']['l'])
        return -1;
    if ($a['hsl']['s'] < $b['hsl']['s'])
         return -1;
    if ($a['hsl']['s'] > $b['hsl']['s'])
          return 1;
    return 0;
 });

/**
 * Check if two hues are in the same given interval
 * @param float $hue1
 * @param float $hue2
 * @param int $interval
 * @return bool
 */
function huesAreinSameInterval($hue1, $hue2, $interval = 30){
    return (round(($hue1 / $interval), 0, PHP_ROUND_HALF_DOWN) === round(($hue2 / $interval), 0, PHP_ROUND_HALF_DOWN));
}

rgbToHsl 发现于www.brandonheyer.com http://www.brandonheyer.com/2013/03/27/convert-hsl-to-rgb-and-rgb-to-hsl-via-php/

hexToRgb 发现于堆栈溢出 https://stackoverflow.com/a/15202130/291541

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

按颜色排序 的相关文章

  • C++并行排序

    我需要对存储在结构数组中的数据块进行排序 结构体没有指针 每个块都有其计数器编号以及数组中数据块与结构块相等的位置的坐标 例如 如果我们有一个数据数组 我们可以将其分为 4 个 NxN 块 那么在结构块的索引数组中我们有 4 个结构块 每个
  • php:验证 POST 的最佳方法

    我一直在使用下面的代码来验证 POST 的用户输入 if isset POST name empty POST name n POST name else errors Please give a name 这段代码检查是否确实设置了 na
  • 选择 mysql 枚举的 php 函数

    因此 我创建了一个函数 它将从数据库中的枚举字段中提取值
  • PHP 内部:TSRMLS_FETCH 如何工作?

    PHP 内部结构是怎样的TSRMLS FETCH宏发挥作用吗 Per the PHP手册 http php net manual en internals2 memory tsrm php 在开发扩展时 包含 tsrm ls is unde
  • 为什么 crontab 不执行我的 PHP 脚本?

    我已经构建了一个 php 文件来检查一些结果 因此我需要设置一个 cronjob 我设置每 30 分钟运行一次 以便发送结果 但是 我不知道为什么我的 crontab 没有每 30 分钟运行一次 这是我设置 crontab 的方法 30 p
  • imagecreatefrompng(和 imagecreatefromstring)导致不可恢复的致命错误

    当我尝试在不正确的 png 图像上使用 php gd 函数时 出现致命的 PHP 错误 这似乎是某种错误 因为根据函数文档 imagecreatefrompng 例如 return resource an image resource id
  • OpenGL:始终相同的颜色

    我正在 Windows 上编写一个程序 使用c opengl 2 1 and SDL我在顶点颜色方面遇到了一些问题 我在用着glColor3f设置每个顶点集的颜色 但它似乎不起作用 无论我选择什么颜色 我都会将每个顶点绘制为红色 我检查了传
  • 更改 Symfony2 中的默认语言环境

    我正在尝试更改应用程序的默认区域设置 到目前为止我尝试过的事情 将 intl default locale 设置为 et EE 将区域设置设置为 et app config parameters ini 更改了我的捆绑包 boot 方法中描
  • 将字符串拆分为字母数组 - 双字符字母 PHP

    我需要将一个字符串拆分为一个字母数组 问题是在我的语言 克罗地亚语 中也有双字符字母 例如 lj nj d 所以字符串如ljubi icajecvijet应该分成一个数组 如下所示 Array 0 gt lj 1 gt u 2 gt b 3
  • 使 TreeMap 比较器容忍 null

    这个定制的 Valuecomarator 按其值对 TreeMap 进行排序 但在搜索 TreeMap 是否具有某个键时 它不能容忍 nullpointException 如何修改比较器来处理零点 import java io IOExce
  • mysqldump创建空sql文件? [Windows 上的 php 和 mysql]

    我尝试转储数据库 我尝试了指定 mysqldump exe 的完整路径或仅使用 mysqldump 它仍然给我一个 0kb dumpfile sql 细节 编程语言 PHP 数据库 MySql 5 XX 操作系统 服务器 Windows S
  • Php mail() vs Yahoo:有人可以简单解释YAHOO从php邮件功能接收邮件所需的步骤吗?

    我已经看到了关于这个主题的数千个类似问题 并且可以肯定的是我知道 标记为重复问题 SO中的事情 然而 仍然不清楚如何或必须做什么 简单来说 才能从 PHP mail 函数接收雅虎收件箱电子邮件 在雅虎网站上 他们提供了一个示例脚本来发送邮件
  • K2_内容模块评级

    我一直在category item php 中重建标准K2 评级 以查看评级从显示为星星到显示为数字 我所做的是 我替换了这段代码 div div class itemRatingForm ul class itemRatingList l
  • 扩展 Codeigniter Exceptions 类以添加自定义方法

    我创建了一个新方法来处理 401 apache 错误 我的核心类扩展了 CI 核心类 但是当我调用方法名称时 我收到此消息 致命错误 调用未定义的函数show 401 in G Path application controllers lo
  • 如何垂直打印数组中的字符串元素? [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个数组 我想垂直打印每个元素 例如 myArr abc def ghi 输出应该是 a d g b e h c f
  • jQuery 时间戳之前的时间?

    下面是一个非常好的 jQuery 插件 与他们在 SO 上使用的插件非常相似 对我来说问题是它用它来转换时间
  • Symfony2 Beta3 中不断收到“您请求了一个不存在的服务“test.client””

    我正在尝试设置单元测试 但每当我运行 phpunit c app 时 我都会收到此错误 Symfony Component DependencyInjection Exception ServiceNotFoundException 您请求
  • 如何从页面获取所有网址(php)

    我有一个页面 其中的网址和描述逐一列出 例如书签 网站列表 如何使用php从该页面获取所有url并将它们写入txt文件 每行一个 只有url而没有描述 页面如下所示 一些描述 http link com 其他说明 http link2 co
  • 错误:SQLSTATE[HY000] [2002] 无法建立连接,因为目标计算机主动拒绝连接

    当我调试代码时突然发生错误 它有一系列关于数据库连接的错误 ERROR SQLSTATE HY000 2002 No connection could be made because the target machine actively
  • 如何检查文件是否为php?

    我想检查文件是否具有扩展名 php 如果有的话我会把它包括在内 有人可以帮我进行正则表达式检查吗 thanks 通常您不使用正则表达式 以下是一种流行的方法 extension pathinfo filename PATHINFO EXTE

随机推荐

  • 更改方法的返回类型会给出 java.lang.NoSuchMethodError

    我更改了库中接口中一个方法的返回类型 以前它是空的 我修改它以返回一个对象 我没有更改模块中的代码 因为我不想对返回的对象执行任何操作 它用于不同的模块 我使用新的库 jar 编译了我的模块并运行了运行良好的单元测试 但是当我将 jar 与
  • 在构建 Vue 应用程序之前,我可以在哪里向生成的脚本标签添加属性?

    我想将属性添加到构建 Webpack Vue 应用程序时生成的脚本标签 我似乎找不到可以在构建脚本之前添加它们的文件 因此它们总是在构建我的应用程序时添加 这些选项存在吗 Thanks 这是我现在构建后的索引文件
  • 使用编码打开内存映射文件

    内存映射文件 https docs python org 3 library mmap html module mmap是使用正则表达式或对大型二进制文件进行操作的有效方法 如果我有一个大文本文件 1GB 是否可以使用编码感知映射文件 正则
  • 视图必须派生自 WebViewPage

    当我决定需要进行一些维护时 我已经有了一个可以运行的 MVC 应用程序 我的视图全部位于 SHARED 目录下 我决定将它们移至单独的目录中 我实现了在这里找到的 CustomViewEngine 我可以在 ASP NET MVC 中指定自
  • 为什么 N'ko 使用 3 位小数来显示定点(“F”)数字,而实际上所有其他文化都使用 2 位小数?

    不同的文化使用不同的小数点分隔符 点 1 23 或逗号 1 23 或者在波斯语 伊朗 的情况下 可能会发现 momayyez 或斜杠 https i stack imgur com 2sxXf png或 1 23 我一直在测试我的库 其中涉
  • 如何在 Javascript/HTML5 中解析 Excel (XLS) 文件

    我可以通过读取 Excel 文件FileReader但它输出文本以及奇怪的字符 我需要阅读xls按行读取文件 读取每一列中的数据并将其转换为 JSON 如何逐行读取xls文件 下面的函数将 Excel 工作表 XLSX 格式 数据转换为 J
  • 无法观察 AVPlayerItem 的 @“status” 键

    我正在尝试从 URL 播放流 但有一个问题 ObserveValueForKeyPath ofObject change context 只是不执行 据我了解 它不取决于streamURL 无论它是否正确 它必须将状态从 AVPlayerI
  • 无法转换 Pandas 数据帧时间戳

    我对使用 Pandas 还很陌生 我正在尝试找出为什么这个时间戳不会转换 例如 一个单独的时间戳是字符串 2010 10 06 16 38 02 代码如下所示 newdata pd DataFrame from records data c
  • 同一服务器上多个站点的 nginx 配置

    我正在尝试创建一个 nginx 服务器 可以在同一服务器上托管多个站点 我在 var www 目录中保留了两个包含 index html 文件的不同目录 第一个目录 dir1 包含文件夹结构为 dir1 Folder app app 目录包
  • Java/MySql如何实现基于角色的访问控制?

    我计划启动一个基于网络的项目 涉及用户注册 就像论坛 CMS 一样 但我的障碍是我不知道如何实现所谓的基于角色的访问控制 我在谷歌上搜索 基于角色的访问控制 并在结果书中找到了以下内容 设计模式 这与我的需要有关吗 有关于实现这个想法的教程
  • 如何在 GNU/Linux 中使用 python 自动化 GUI 应用程序的操作? [复制]

    这个问题在这里已经有答案了 如何自动化 gthumb 增强颜色 选项 gThumb 是一款适用于 GNU Linux 的优秀图像管理软件 当我们看到图像时 我们可以在 gthumb 中轻松增强颜色 但是 我们必须单击图像 然后单击按钮 增强
  • 错误“无法实例化活动...在路径上找不到类:DexPathList”

    当我尝试构建应用程序时Eclipse 我收到以下错误 05 20 15 04 51 202 E AndroidRuntime 1543 FATAL EXCEPTION main 05 20 15 04 51 202 E AndroidRun
  • ExtJS 6 在内存代理中使用自定义过滤功能

    我有一家商店配置了内存代理 http docs sencha com extjs 6 2 1 modern Ext data proxy Memory html with enablePaging true 商店的remoteFilter
  • MVVM Light IsInDesignMode 属性不起作用

    我遇到一个问题 即在 VS 或 Blend 中运行解决方案时 属性 IsInDesignMode 未返回预期值 true 我的环境由Win Server 2008 R2 VS2010 Pro Blend 4和MVVM Light V3组成
  • 如何理解指令的“terminal”?

    在此页面中 http docs angularjs org guide directive http docs angularjs org guide directive 指令定义对象 terminal 如果设置为 true 则当前优先级将
  • 运行时检查失败 #2 - 变量“x”周围的堆栈已损坏

    在以下代码中返回时 我收到此运行时检查失败 我相信类似的代码在程序的其他地方运行良好 有任何想法吗 String GetVariableName CString symbol CString filepath char acLine 512
  • 在 MySQL 中使用 ALTER TABLE 建立索引需要多长时间?

    这可能有点像询问字符串的长度有多长 但统计数据是 英特尔双核 4GB 内存 具有 800 万行 约 20 列的表 大部分为具有 auto increment 主 id 的 varchar 查询是 ALTER TABLE my table A
  • mobx中无法观察到对象的深层变化

    我在反应中使用 mobx 6 3 12 管理状态 但我无法观察到物体的深层变化 这是我的消息来源 store class ApiStore values name author constructor makeObservable this
  • Sequelize表名更改

    已将表重命名为users to user在 MySQL 数据库中 在Express我在跑Sequelize并为旧的创建了一个架构users桌子 重命名表并且代码中的所有内容都从users to user Sequelize仍在寻找专门命名的
  • 按颜色排序

    我有一长串 1000 十六进制颜色 分为一般颜色类别 红色 橙色 蓝色等 当我显示每个类别中的颜色列表时 我需要按颜色顺序显示它们 即先浅红色 最后深红色 执行此操作的算法是什么 谷歌搜索让我失败了 我知道这个问题很老了 但是我没有找到解决