【问题标题】:How to convert artbitrary number to rgb color?如何将artbitrary数字转换为rgb颜色?
【发布时间】:2012-05-01 01:13:37
【问题描述】:

我有一个拥有大约一百个用户的应用程序。我们有一个日历视图,其中每个用户都可以有多个条目。同一个用户的每个条目应该有相同的颜色,但不同的用户应该有不同的颜色。目前我们在一个数组中手动​​定义了大约 25 种颜色,用户获取的颜色由

$color = $colors[$userid % count($colors)];

我们不想为每个新用户手动添加颜色,为每个用户选择颜色似乎也有点乏味。

是否有一个简单的函数可以将数字(用户 ID)映射到颜色(最好是 RGB)?下一个问题是;有没有办法将函数限制为特定类型的颜色(即只有白色字母可读的颜色)?

【问题讨论】:

  • 用户 ID 不会是 6 位十六进制代码吧?

标签: php colors


【解决方案1】:

您想在色调饱和度亮度或色调饱和度值(HSL 或 HSV)空间中工作。

http://en.wikipedia.org/wiki/HSL_and_HSV

首先根据色调和饱和度定义一些颜色,并将亮度设置为使文本可读的最高可容忍级别。

然后您可以修复这些颜色的色调和饱和度并降低​​亮度。

假设您从选择 25 种具有不同色调和最大/最小可容忍亮度的可容忍颜色开始。

要为索引生成颜色,请选择以base = id % 25 开头的基色,然后根据该颜色index = (Math.floor(id/25)) 中的索引降低亮度。根据该值将亮度设置在可容忍的亮度范围内。所以假设我们每种颜色有 5 个亮度值,将亮度设置为

lightness = maxLightness - index*(maxLightness / 4*minLightness)

这只是改变每种颜色的亮度。如果您愿意,可以选择稍微改变饱和度和色调。 HSV 和 RGB 之间的转换是一个有据可查的过程。

PHP HSV to RGB formula comprehension

【讨论】:

    【解决方案2】:

    我本身没有解决方案,但有一个建议。

    首先,由于您希望每个用户的颜色都是唯一且随机的,因此您可以从某种数值散列函数开始。这会给你一个很可能是唯一的随机数。如果你的散列函数不错,并且你的用户有数百个就足够了。

    现在您需要将其转化为颜色,最好是在光谱的暗端。如果您使用 RGB,则需要三个数字。为了使它们保持黑暗,假设您将总或 R、G 和 B 保持在 200 以下。当然,这是一个猜测,但它应该很暗。选择一个介于 1 和 3 之间的随机数 [index] - 这就是您要开始的 R、G 或 B。获取一个介于 0 到 200 之间的数字,并将其设置为 color[index1]。现在选择剩余的索引之一,1-3。为此,请选择一个介于 0 和 color[index1] 之间的数字。将剩余数量设置为 200-color[index1]-color[index2]。现在你有一个随机的 RGB 值,应该与白色形成对比。

    我意识到我从来没有从那个哈希函数中得到太多用处 - 也许放弃它,只是使用用户 ID 作为随机(种子)。

    【讨论】:

    • 我已经实现了这样的东西;我用用户 id 为随机数生成器播种,为总数(R+G+B)生成一个介于 200 和 300 之间的随机数,然后生成 3 个随机百分比,一个用于 R,一个用于 G,一个用于 B。缩放百分比,因此它们总和为 100 并分配相应的值。当然,我必须添加一些额外的检查,以使 R、G 或 B 永远不会 > 255。
    • 另一种虽然我建议的方法可以简化它 - 完全随机选择 RG&B,然后将它们相加并通过将所有三个减少相同的百分比来缩放亮度因子以制作新的总低于某个阈值。可能有一个公式可以给出某种可读性对比度指数 - 你可以用它做一些测试,看看颜色是否落入阅读白色文本的可接受范围。
    猜你喜欢
    • 2010-09-26
    • 2011-08-25
    • 1970-01-01
    • 2019-02-08
    • 1970-01-01
    • 2020-01-16
    • 2017-03-21
    • 2011-05-05
    • 2013-12-10
    相关资源
    最近更新 更多