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

Ruby 根据百分比生成十六进制数,ruby,Ruby,我正在寻找一种方法来生成一个渐进的十六进制颜色的基础上与红宝石百分比 0% = #6da94a 50% = #decc30 100% = #ce2d4a 然后以编程方式在这些值之间生成十六进制值 所以我可能会有类似于百分比到十六进制(10)的东西,它会沿着0%(绿色)和50%(黄色)之间的渐变吐出任何十六进制值是10%。不是一个非常精细的方法,但这里有一个好的开始: # Example input: percent_to_hex(25, "abcdef", "ffffff") => "c

我正在寻找一种方法来生成一个渐进的十六进制颜色的基础上与红宝石百分比

0% = #6da94a
50% = #decc30
100% = #ce2d4a
然后以编程方式在这些值之间生成十六进制值


所以我可能会有类似于百分比到十六进制(10)的东西,它会沿着0%(绿色)和50%(黄色)之间的渐变吐出任何十六进制值是10%。

不是一个非常精细的方法,但这里有一个好的开始:

# 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

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

实际上,tralston的答案中有一个小错误

(x + percent * 100 * (y - x)).round
应改为:

(x + percent / 100.0 * (y - x)).round
另外,
i.to_s(16)
如果有0(255),则会出现问题,因为可以得到类似“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

你试过什么?这似乎不是Ruby的问题。更像是一个颜色理论问题。我会先试试交叉乘法。。。