【问题标题】:Linearly increasing color darkness algorithm线性增加色深算法
【发布时间】:2010-11-23 20:43:11
【问题描述】:

我想用 ruby​​ 编写一个函数,给定 1 到 500 之间的数字,将输出一个 6 位十六进制颜色代码,数字越大,颜色越暗。这似乎并不难,但我不知道从哪里开始。我该如何实现?

编辑

Hue 似乎是一种更可靠的方法。我想给出一个参考颜色,比如绿色,然后根据输入的数字将其变暗或变亮。

输入:10
输出:颜色代码(以 rgb 或 HSV 表示),它是参考颜色的明暗度

输入:400
输出:颜色代码(以 rgb 或 HSV 表示)是参考颜色的相当暗的阴影

编辑 2

我需要使用 1 到 500 之间的唯一原因是因为这是我必须使用的输入。如果一些靠近的数字映射到相同的颜色,那也没关系。

【问题讨论】:

  • 不确定你到底在问什么。能举个输入输出的例子吗?
  • 灰度只有 256 个亮度级别。例如0x000000, 0x010101 ... 0xfefefe, oxffffff,所以 500 似乎有点无意义。如果你想改变色调,例如从浅蓝色到深红色还有更多步骤,但您需要进一步澄清您的问题。
  • 您是想让参考颜色逐渐变暗,还是对从白色到黑色的渐变感到满意?
  • 你说你想做一个“函数”……你希望这个函数用什么语言来写?
  • 记住 sRGB 是非线性的。

标签: css algorithm function colors hex


【解决方案1】:

那为什么不直接返回一个灰度,#ffffff 到 #000000?无论如何,500 级的黑暗并不能真正区分,而灰色则为您提供 256 级。

【讨论】:

  • 谢谢,但我需要使用参考颜色。灰色不适合我。
  • 只需将数字 1 到 500 除以 2 即可得到 1 到 250,这可能非常适合您的需要。 (实际数学:nuval = oldval * 255 / 500 -- 使用整数,确保在除法之前相乘)
【解决方案2】:

6 位十六进制颜色代码为 RGB。 你想要的是在 HSV 中工作:选择一个色相和饱和度,然后逐渐降低值。 从 HSV 转换为 RGB 以输出颜色。 示例见here

【讨论】:

  • 这看起来不错。有没有一种简单的方法可以在 Ruby 中从 HSV 转换为 RGB?
  • @William - 是的,Jared Updike 的维基百科链接显示了一个简单的公式。您只需要底数、模数和算术。
【解决方案3】:

如果您只想使参考颜色变暗,这很容易。给定你想要的最亮的 R、G、B 颜色,将 3 个值中的每一个乘以(500 输入)并除以 499。将每个值转换为 2 个十六进制数字并在它们后面加上 #前面。

【讨论】:

  • 正如在别处所指出的,这不是 RGB 颜色的工作方式。 HSV 是一种更好的颜色系统。
  • 我不确定我是否理解反对意见。在另一个颜色空间中还有其他操作可能更容易,但是使 RGB 颜色变暗是非常简单的。
【解决方案4】:

基本线性插值?

// Pseudocode
function fade_colour(source, factor)
    const max = 500
    const min = 1

    foreach component in source
        output[component] = round(source[component] * (max - value) / (max - min))
    endforeach

    return output
endfunction

【讨论】:

  • @Ransom,你确定吗?根据谷歌的说法,如果我输入 value=1,我会得到 source[component],如果我输入 value=500,我会得到 0。
  • 对不起,我不知道我在想什么 - 你的公式和我的完全一样,只是更通用。我撤回我的评论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-20
  • 2013-01-28
  • 2012-09-26
  • 2020-05-04
相关资源
最近更新 更多