【问题标题】:Generate high contrast random color using PHP使用 PHP 生成高对比度随机颜色
【发布时间】:2013-01-07 10:21:35
【问题描述】:

我需要为系统中的所有用户生成随机颜色。诀窍是两个用户不能有非常相似的颜色,他们需要区分。我有代码在给定原始混合颜色的情况下生成随机颜色,但无法找到仅使用 PHP 生成具有高对比度的随机颜色的方法

public static function generateRandomColor($rgb)
{
    $red = rand(1, 256);
    $green = rand(1, 256);
    $blue = rand(1, 256);

    if (! empty($rgb))
    {
        $red = ($red + $rgb['red']) / 2;
        $green = ($green + $rgb['green']) / 2;
        $blue = ($blue + $rgb['blue']) / 2;
    }

    $color = "rgb({$red}, {$green}, {$blue})";

    return $color;
}

然后我有一个循环:

$colorsArr = array();
$mixed = array('red' => 255, 'green' => 255, 'blue' => 255);
for($i = 0; $i < count($users); $i++)
{
    $color = generateRandomColor($mixed);

    $colorsArr .= '<div style="width:25px; height: 25px; background-color: ' . $color . '"></div>';
}

现在这会生成颜色,但有些颜色看起来很像。目标是为每个用户提供独特的颜色。 任何帮助表示感谢。

注意:我不想为 500 个用户硬编码颜色

【问题讨论】:

  • 500 个用户之间的对比度不能太高。只是随机的,不重复的。
  • 按照你的解释,这是不可能的……除非你把高对比度的阈值设置得很低。
  • 如果有新用户到达,你认为这应该如何工作?如果为 500 个用户创建一个最优解,当 501 个用户到达时应该怎么做??
  • $myhex = '#' . substr(md5($username), 0, 6); // output: #14c4b0
  • @Sammitch 如何保证颜色之间的对比?

标签: php random colors


【解决方案1】:

我很无聊,这里有一些代码你可以用:

<?php
define( COL_MIN_AVG, 64 );
define( COL_MAX_AVG, 192 );
define( COL_STEP, 16 );

// (192 - 64) / 16 = 8
// 8 ^ 3 = 512 colors

function usercolor( $username ) {
        $range = COL_MAX_AVG - COL_MIN_AVG;
        $factor = $range / 256;
        $offset = COL_MIN_AVG;

        $base_hash = substr(md5($username), 0, 6);
        $b_R = hexdec(substr($base_hash,0,2));
        $b_G = hexdec(substr($base_hash,2,2));
        $b_B = hexdec(substr($base_hash,4,2));

        $f_R = floor((floor($b_R * $factor) + $offset) / COL_STEP) * COL_STEP;
        $f_G = floor((floor($b_G * $factor) + $offset) / COL_STEP) * COL_STEP;
        $f_B = floor((floor($b_B * $factor) + $offset) / COL_STEP) * COL_STEP;

        return sprintf('#%02x%02x%02x', $f_R, $f_G, $f_B);
}

for( $i=0; $i<30; $i++ ) {
        printf('<div style="height: 100px; width: 100px; background-color: %s">&nbsp;</div>'."\n", usercolor(rand()));
}

许多颜色看起来非常相似,但它们彼此相邻的可能性很小。

【讨论】:

  • 谢谢,生成5分钟后,我得到了不相似的颜色。
猜你喜欢
  • 2011-11-07
  • 2013-04-02
  • 2017-01-29
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 2021-05-22
  • 1970-01-01
  • 2011-08-02
相关资源
最近更新 更多