使用 PHP 生成随机十六进制颜色代码

Posted

技术标签:

【中文标题】使用 PHP 生成随机十六进制颜色代码【英文标题】:Generating a random hex color code with PHP 【发布时间】:2011-08-02 15:21:51 【问题描述】:

我正在做一个项目,我需要生成未定义数量的随机十六进制颜色代码……我将如何在 php 中构建这样的函数?

【问题讨论】:

您所说的“网络安全”到底是什么意思? "Web safe colours" 的旧概念已不再流行。 每种颜色都有一个十六进制代码……但只有某些颜色保证在所有计算机上呈现相同的内容阅读一点:bit.ly/hnFAbB 正如@Pekka 所说,当某些计算机只有几百或几千种颜色时,这是一个非常过时的概念。如今,任何可能正在浏览网页的计算机都可以处理数百万种颜色。一些阅读:en.wikipedia.org/wiki/Web_colors#Web-safe_colors 即使是您链接到的 W3schools 文章也是正确的:“这在今天并不重要,因为大多数计算机可以显示数百万种不同的颜色。” 更新:我已从问题中删除了“网络安全”,因为 OP 通过接受的答案忽略了该资格。 【参考方案1】:

有效的十六进制颜色可以包含 0 到 9 和 A 到 F,所以如果我们用这些字符创建一个字符串,然后将其打乱,我们可以抓取前 6 个字符来创建一个随机的十六进制颜色代码。下面是一个例子!

代码

echo '#' . substr(str_shuffle('ABCDEF0123456789'), 0, 6);

我在 while 循环中对此进行了测试,并生成了 10,000 种独特的颜色。

我用来生成 10,000 种独特颜色的代码:

$colors = array();
while (true) 
   $color          = substr(str_shuffle('ABCDEF0123456789'), 0, 6);
   $colors[$color] = '#' . $color;
   if ( count($colors) == 10000 ) 
      echo implode(PHP_EOL, $colors);
      break;
   

结果给了我these random colors。


outis 指出我的第一个示例无法生成诸如“4488CC”之类的十六进制,因此我创建了一个能够生成类似十六进制的函数。

代码

function randomHex() 
   $chars = 'ABCDEF0123456789';
   $color = '#';
   for ( $i = 0; $i < 6; $i++ ) 
      $color .= $chars[rand(0, strlen($chars) - 1)];
   
   return $color;

    
echo randomHex();

使用第二个示例会更好,因为它可以返回比第一个示例更多不同的结果,但是如果您不打算生成很多颜色代码,那么第一个示例就可以了。

【讨论】:

range+array_merge+implode 太过分了(为什么不简单地使用字符串常量?)。 str_shuffle 的结果不会产生许多潜在的随机颜色字符串,例如“4488CC”,因为每个十六进制在输入字符串中只出现一次。您必须在 str_shuffle 的输入中准确地重复每个 hexit 6 次才能获得正确的行为,但是,在这一点上,它仍然是矫枉过正。 我同意范围、合并和内爆是矫枉过正,并用一个简单的字符串替换它们。我确实想到了诸如“4488CC”之类的十六进制,但我想在一行代码中保持简单,而不会使行变得很长。我创建了一个可以生成十六进制的函数,例如“4488CC”,我会将其添加到我的答案中。【参考方案2】:

这在很大程度上基于上面的@Galen 版本,但是,我想添加范围控制,可以将产生的颜色限制为红色、绿色、蓝色、更亮或更暗。它可能对其他人有用。

function random_colour_part($lower, $upper)

    //randomly select colour in range and convert to hexidecimal
    return str_pad(dechex(mt_rand($lower, $upper)), 2, '0', STR_PAD_LEFT);


function random_colour($colour)

    //loop through colour
    foreach ($colour as $key => $value)
    
        //retrieve each r,g,b colour range and generate random hexidecimal colour
        if ($key == "r") $r = random_colour_part($value[0], $value[1]);
        if ($key == "g") $g = random_colour_part($value[0], $value[1]);
        if ($key == "b") $b = random_colour_part($value[0], $value[1]);
    

    //return hexidecimal colour
    return "#" . $r . $g . $b;


//generate a random red-based colour
echo random_colour(["r"=>[0,255], "g"=>[0,0], "b"=>[0,0]]);

//generate a random light green-based colour (use only half of the 255 range)
echo random_colour(["r"=>[0,0], "g"=>[127,255], "b"=>[0,0]]);

//generate a random colour of any sort
echo random_colour(["r"=>[0,255], "g"=>[0,255], "b"=>[0,255]]);

【讨论】:

【参考方案3】:

如果有人想生成浅色

sprintf('#%06X', mt_rand(0xFF9999, 0xFFFF00));

【讨论】:

【参考方案4】:
$rand = str_pad(dechex(rand(0x000000, 0xFFFFFF)), 6, 0, STR_PAD_LEFT);
echo('#' . $rand);

您可以根据需要将rand() 更改为mt_rand(),也可以将strtoupper() 放在str_pad() 周围以使随机数看起来更好(尽管不是必需的)。

它工作得很好,比这里描述的所有其他方法都简单:)

【讨论】:

【参考方案5】:
function random_color()  
 return sprintf('#%06X', mt_rand(0, 0xFFFFFF));

【讨论】:

重复答案。【参考方案6】:

我认为这会很好,因为它可以提供任何颜色

$color= substr(str_shuffle('AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899AABBCCDDEEFF00112233445566778899'), 0, 6);

【讨论】:

【参考方案7】:

我就是这样做的。

<?php echo 'rgba('.rand(0,255).', '.rand(0,255).', '.rand(0,255).', 0.73)'; ?>

【讨论】:

【参考方案8】:

最短路径:

echo substr(uniqid(),-6); // result: 5ebf06

【讨论】:

这不适用于超过 1 种颜色,因为时间相同,uniqid() 也一样。 The uniqid() function generates a unique ID based on the microtime (current time in microseconds). 对于那些想要一次生成超过 1 种颜色的人。【参考方案9】:

不再需要网络安全颜色(甚至也不再是一个有效的概念),因为如今即使是移动设备也有 16 位以上的颜色。

请参阅Wikipedia 了解更多信息。

换句话说,使用从#000000 到#FFFFFF 的任何颜色。

编辑: 亲爱的反对者。首先检查问题的编辑历史记录。

【讨论】:

【参考方案10】:
$color = sprintf("#%06x",rand(0,16777215));

【讨论】:

【参考方案11】:

从 PHP 5.3 开始,您可以使用 openssl_random_pseudo_bytes():

$hex_string = bin2hex(openssl_random_pseudo_bytes(3));

【讨论】:

openssl 对此太过分了。 @TimWolla:我不确定您所说的“过度杀伤”是什么意思,但请注意:1)问题中没有任何内容表明目的或数字的“随机”程度, 2)在我的测试中,我提出的答案比接受的答案快得多。 3)我的答案不是像接受的答案那样创建两个函数,而是一行代码。 &lt;?php foreach(range(0,100) as $n)echo("&lt;div style='background-color:#".(bin2hex(openssl_random_pseudo_bytes(3))).";padding:1em;'&gt;&lt;/div&gt;");?&gt; 表明这给出了最丰富多彩和随机的结果。试试phpfiddle.org!【参考方案12】:

你可以使用 md5 来达到这个目的,非常短

$color = substr(md5(rand()), 0, 6);

【讨论】:

如果没有参数,rand() 在某些平台(包括 Windows,根据 documentation)不会返回大于 32767 的数字。除此之外,与简单地将数字转换为十六进制相比,使用md5() 没有任何优点和一些缺点,即md5() 可能不会产生规则分布(某些十六进制字符串可能比其他字符串出现的频率更高)。【参考方案13】:

获取一个0到255之间的随机数,然后将其转换为十六进制:

function random_color_part() 
    return str_pad( dechex( mt_rand( 0, 255 ) ), 2, '0', STR_PAD_LEFT);


function random_color() 
    return random_color_part() . random_color_part() . random_color_part();


echo random_color();

【讨论】:

其实这个方法是所有答案中最慢的,最后2个答案快了300%(我测试它生成并输出2500个表格单元格); 下面的答案更有效率。 @aleation - 比 0.005 秒快 300%!伟大的!不过说真的,使用最易读的东西。不要挑剔超过 0.00007 秒。 (不是说我的可读性最强) @aleation:盖伦是正确的,为什么我仍然将他的答案标记为已接受的解决方案。虽然下面的事情效率更高,但我可以将上面的代码保持原样,人们会理解我在做什么。对于下面的单行者来说不是那么多。 这是否更具可读性取决于阅读它的人。我发现它的可读性更高,而不必将我的头绕在两个函数上,并且单行在其应用中更加灵活。有了这个我可以做例如 = '#' 。 str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT); ?>【参考方案14】:

RGB 十六进制字符串只是一个从 0x0 到 0xFFFFFF 的数字,因此只需在该范围内生成一个数字并将其转换为十六进制:

function rand_color() 
    return '#' . str_pad(dechex(mt_rand(0, 0xFFFFFF)), 6, '0', STR_PAD_LEFT);

或:

function rand_color() 
    return sprintf('#%06X', mt_rand(0, 0xFFFFFF));

【讨论】:

以上是关于使用 PHP 生成随机十六进制颜色代码的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JavaScript 随机生成 HTML 十六进制颜色代码? [复制]

生成随机种子十六进制颜色?

JavaScript随机生成颜色以及十六进制颜色 与RGB颜色值的相互转换

如何创建代表颜色的随机十六进制字符串?

PHP 随机颜色十六进制

JavaScript随机生成十六进制颜色