根据百分比生成十六进制数

时间:2014-07-24 21:11:43

标签: ruby

我正在寻找一种基于Ruby百分比生成渐进十六进制颜色的方法。

0% = #6da94a
50% = #decc30
100% = #ce2d4a

然后以编程方式生成它们之间的十六进制值。

所以我可能会有类似percent_to_hex(10)的东西,并且会在0%(绿色)和50%(黄色)之间的渐变梯度上吐出10%的十六进制值。

2 个答案:

答案 0 :(得分:2)

实际上,在tralston的答案中存在一个小错误。

(x + percent * 100 * (y - x)).round

应更改为:

(x + percent / 100.0 * (y - x)).round

如果你有0(255),那么i.to_s(16)也会有问题,因为你可以得到像“ff0ff”这样的结果。我建议改为使用"%02x" % i

以下是完整的示例:

def percent_to_hex(percent, start, stop)
  colors = [start,stop].map do |c|
    c.scan(/../).map { |s| s.to_i(16) }
  end

  colors_int = colors.transpose.map do |x,y|
    (x + percent / 100.0 * (y - x)).round
  end

  colors_int.map { |i| "%02x" % i }.join("")
end

答案 1 :(得分:0)

这不是一个非常精致的方法,但这是一个良好的开端:

# Example input: percent_to_hex(25, "abcdef", "ffffff") => "c0daf3"
def percent_to_hex(percent, start, stop)
  colors = [start,stop].map do |c|
    c.scan(/../).map { |s| s.to_i(16) }
  end

  colors_int = colors.transpose.map do |x,y|
    (x + percent * 100 * (y - x)).round
  end

  colors_int.map { |i| i.to_s(16) }.join("")
end

当然,如果您可以进一步自定义它来添加或删除前导"#"十六进制颜色代码等