【发布时间】:2018-12-06 16:25:13
【问题描述】:
我知道以前有人问过这个问题,但我需要比 SO 提供的其他答案更多的帮助。
我目前有一个循环遍历我的数据库中的记录的 foreach 循环。每行包含一个唯一的“id”主要属性(1、2、3、4、5 等)。
在我的循环中,我需要根据其 ID 为每条记录生成一个 UNIQUE RGB 值。生成的 RGB 值将应用于绑定到该记录的 HTML 元素的文本。生成的颜色对于记录本身必须是唯一的(通过“id”),这就是我不使用循环迭代器的原因。
我已经为我创建了一个工作函数来执行此操作,但我还需要一件事 - 我需要 rgb 值在白色背景上具有大于 4:5:1 的对比度。我的功能会生成太亮的颜色,使文本难以阅读。如何修改我的函数以生成与白色背景形成鲜明对比的较暗颜色?
function makeRgbFromValue(int $value){
$hash = md5($value);
return implode(", ", [
hexdec(substr($hash, 0, 2)), // r
hexdec(substr($hash, 2, 2)), // g
hexdec(substr($hash, 4, 2)) // b
]);
}
// Example output: "100, 201, 20"
// My html, using Laravel Blade syntax:
@foreach($categories as $cat)
<a
href="/blog/channels/{{ $cat->slug }}"
style="color: rgb(
{{ makeRgbFromValue($cat->id) }}
)"
>
{{ $cat->name }}
</a>
@endforeach
也许这是不可能的......但我希望你们中的一位数学天才可以帮助我:)
【问题讨论】:
-
使用 md5,你的增量值会在某个时候发生冲突,所以你不能保证唯一..
-
如果他每次都使用唯一的ID,会如何碰撞? @LawrenceCherone
-
它不必是 100% 唯一的,但我更喜欢更少的冲突而不是更多的冲突。 md5现在适合
-
为什么不手动定义 50 或 100 种颜色并在记录中循环呢? id 1 得到颜色 1,id 2 得到颜色 2,id 101 得到颜色 1。它可以让您更好地控制输出
-
我希望您从用户体验的角度来考虑这一点。人类的感知只能合理区分有限数量的颜色(有人说最多 7 +- 2)。因此,预先指定调色板(例如来自ColorBrewer)并根据 id 从中选择颜色可能更合理、更容易。
标签: php algorithm function math colors