如何将工件数转换为 rgb 颜色


How to convert artbitrary number to rgb color?

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

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

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

是否有一个简单的功能将数字(用户 id)映射到颜色(最好是 RGB)?下一个出现的问题是;有没有办法将功能限制为某些类型的颜色(即只有白色字母可读的颜色)?

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

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

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

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

您想要在色调饱和度亮度或色相饱和度值(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 到 RGB 公式理解