如何按色相(Hue)对十六进制(hex)颜色列表进行排序?
按色相为十六进制颜色排序的Ruby实现
要给你哈希里的十六进制颜色按色相排序,核心思路是先把十六进制颜色转换成**色相(Hue)**值,再基于这个值对哈希条目进行排序。下面是具体的实现方案:
步骤1:实现十六进制转色相的辅助方法
首先我们需要一个工具方法,把十六进制颜色字符串转换成0-360范围的色相值:
def hex_to_hue(hex) # 移除颜色字符串里的#号,确保是标准6位十六进制格式 hex_clean = hex.delete('#') # 把十六进制转成0-1范围的RGB值 r = hex_clean[0..1].to_i(16) / 255.0 g = hex_clean[2..3].to_i(16) / 255.0 b = hex_clean[4..5].to_i(16) / 255.0 max_rgb = [r, g, b].max min_rgb = [r, g, b].min delta = max_rgb - min_rgb hue = 0 # 只有非灰度色需要计算色相,灰度色(delta=0)色相固定为0 if delta != 0 case max_rgb when r hue = ((g - b) / delta) * 60 when g hue = ((b - r) / delta) * 60 + 120 when b hue = ((r - g) / delta) * 60 + 240 end end hue % 360 # 确保色相值在0-360区间内 end
步骤2:基于色相排序哈希
接下来用这个辅助方法对你的原始哈希进行排序:
# 你的原始颜色哈希 My_hash = { "1"=>["#00050c"], "2"=>["#ffffff"], "3"=>["#d6e7ff"], "4"=>["#008000"], "5"=>["#0768ef"], "6"=>["#07408e"], "7"=>["#42AAFF"], "8"=>["#21406b"], "9"=>["#032656"] } # 按色相值升序排序哈希条目,再转回哈希格式 sorted_hash = My_hash.sort_by do |key, color_array| hex_to_hue(color_array.first) end.to_h # 输出排序后的颜色列表 sorted_hash.each_value { |value| puts value }
说明
- 灰度色(比如#ffffff白色、#00050c深黑)的RGB差值为0,所以色相值固定为0,会排在排序结果的最前面。
- 排序后的颜色会按照色相从0(红/灰度)→120(绿)→240(蓝)的自然色环顺序排列。
- 代码适用于Ruby 2.1及以上版本,因为用到了
sort_by后转哈希的to_h方法。
内容的提问来源于stack exchange,提问作者Маратон
相关产品推荐
相关产品推荐

