使用 PHP 随机生成颜色

Posted

技术标签:

【中文标题】使用 PHP 随机生成颜色【英文标题】:Random color generation using PHP 【发布时间】:2011-11-07 22:53:42 【问题描述】:

我正在尝试在 php 中生成随机的 html 颜色,但我无法让它们看起来相似或属于同一个系列。除了生成和连接 6 个随机十六进制数字之外,是否有一些函数可以用来生成与另一种颜色“相似”的颜色?

【问题讨论】:

类似颜色的例子? 是的,类似的意思是什么?亮度范围?光谱范围? 想象一盒蜡笔,我在想像所有浅色的东西,例如浅蓝色、浅绿色等,或所有“褪色”的颜色。我不是 100% 确定这里的技术术语,但希望能回答您的问题。 【参考方案1】:

你可以

    生成一个介于 25 和 230 之间的随机十进制数(您的“基数”) 生成 3 个 1 到 25 之间的随机数(任意决定它们是正数还是负数) 将这三个数字与您的基数相加,得到三个不同的数字(您的 R、G 和 B) 重复第 2 步和第 3 步以获得更多相似的颜色

您可以扩大修饰符编号的范围(从 1 到 25)以获得更多的颜色变化(您还必须更改基数的范围,因此您保持在 0 到 255 之间)。

我对PHP一无所知,这就是我不放代码的原因。但我认为这是一个有趣的问题 =)

编辑:我意识到在第 1 步中生成 3 个随机基数将使您的颜色看起来不那么柔和(灰色)。然后你可以按照步骤 2 和 3 来获得不同的色调等,正如我已经提到的(并且,正如@Peter 提到的,增加修饰符的数量有可能获得更少的“相似”颜色)

此技术的示例输出基于两组不同的基数):

编辑 2:这是@Peter Ajtai 的 PHP 实现

<?php
$spread = 25;
for ($row = 0; $row < 100; ++$row) 
        for($c=0;$c<3;++$c) 
        $color[$c] = rand(0+$spread,255-$spread);
    
    echo "<div style='float:left; background-color:rgb($color[0],$color[1],$color[2]);'>&nbsp;Base Color&nbsp;</div><br/>";
    for($i=0;$i<92;++$i) 
    $r = rand($color[0]-$spread, $color[0]+$spread);
    $g = rand($color[1]-$spread, $color[1]+$spread);
    $b = rand($color[2]-$spread, $color[2]+$spread);    
    echo "<div style='background-color:rgb($r,$g,$b); width:10px; height:10px; float:left;'></div>";
        
    echo "<br/>";

?>

【讨论】:

我现在远离我的电脑,但我意识到这可能只会产生随机的灰色阴影 =/ 存在感。 灰色,但并非完全灰色。您可以增加 25 以减少灰色,但它们的“相关性”较少 - 我认为您的方法基本上是这里的第五个 ==> codepad.viper-7.com/tCtTdb @Peter 感谢您的确认,我担心我完全搞砸了哈哈。我已经通过稍微修改和实际技术的屏幕截图更新了答案 - 我将其编码为C#,而不是PHP =) @Rich D:如果您希望我发布 C# 代码(这样您就可以大致了解要做什么,然后将其转换为 PHP),请告诉我。祝你好运! @Rich - (@jadarnel - 这是一种有趣的方式)它在 PHP 中。只需更改$spread 即可扩大或缩小范围。 ==> codepad.viper-7.com/lYj9Hp(显示 100 种基色和一行“相关”颜色)【参考方案2】:

在the blog of someone called Craig Lotter:上发现了一些更好的帖子

$randomcolor = '#' . dechex(rand(0,10000000));

【讨论】:

对于 CSS 我们可以使用更严格的命令:'#' . dechex(rand(256,16777215))。这将在#100 和#ffffff 之间生成十六进制颜色。【参考方案3】:

我基于共享亮度的颜色编写的复杂类。范围越近,颜色越灰。范围越高,颜色越亮。

class colorGenerator


    protected $rangeLower, $rangeHeight;
    private $range = 100;

    function __construct($range_lower = 80, $range_higher = 160)
    
        // range of rgb values
        $this->rangeLower  = $range_lower;
        $this->rangeHeight = $range_higher - $range_lower;
    

    protected function randomColor()
    
        // generate random color in range
        return $this->generateColor(rand(0, 100));
    

    protected function generateColor($value)
    
        // generate color based on value between 0 and 100
        // closer the number, more similar the colors. 0 is red. 50 is green. 100 is blue.
        $color_range  = $this->range / 3;
        $color        = new stdClass();
        $color->red   = $this->rangeLower;
        $color->green = $this->rangeLower;
        $color->blue  = $this->rangeLower;
        if ($value < $color_range * 1) 
            $color->red += $color_range - $value;
            $color->green += $value;
         else if ($value < $color_range * 2) 
            $color->green += $color_range - $value;
            $color->blue += $value;
         else if ($value < $color_range * 3) 
            $color->blue += $color_range - $value;
            $color->red += $value;
        
        $color->red = round($color->red);
        $color->blue = round($color->blue);
        $color->green = round($color->green);
        // returns color object with properties red green and blue.
        return $color;
    

    protected function RGBColor($stdClass)
    
        $RGB = "rgb($stdClass->red, $stdClass->blue, $stdClass->green)";
        return $RGB;
    

    function CreateColor($value) 
        $stdClass = $this->generateColor($value);
        return $this->RGBColor($stdClass);
    

    function CreateRandomColor($value) 
        $stdClass = $this->randomColor($value);
        return $this->RGBColor($stdClass);
    

【讨论】:

【参考方案4】:
function randomColor() 
$str = '#';
for ($i = 0; $i < 6; $i++) 
    $randNum = rand(0, 15);
    switch ($randNum) 
        case 10: $randNum = 'A';
            break;
        case 11: $randNum = 'B';
            break;
        case 12: $randNum = 'C';
            break;
        case 13: $randNum = 'D';
            break;
        case 14: $randNum = 'E';
            break;
        case 15: $randNum = 'F';
            break;
    
    $str .= $randNum;

return $str;

【讨论】:

【参考方案5】:

你可以制作你自己的函数来生成你自己的rgb颜色

http://sandbox.phpcode.eu/g/bf2a5/1

<?php  
function gen() 
    for($i=1;$i<200;$i++) 
       echo "<div style='color:rgb($i,$i,0);'>hello</div>"; 
     
 

gen(); 
?>

或背景色

http://sandbox.phpcode.eu/g/bf2a5/2

<?php  
function gen() 
    for($i=1;$i<200;$i++) 
       echo "<div style='background-color:rgb($i,$i,0);'>hello</div>"; 
     
 

gen(); 
?>

【讨论】:

这基本上是我已经在做的,并且生成的颜色不能很好地协同工作。 这不是随机的。它只是一堆红色/绿色的连续阴影。 @MarcB: 我认为 $i 可以是 rand()omed 那么你又回到了 OP 的船,拥有非常不同的随机颜色 - OP 想要颜色相对相同(浅棕色 + 深棕色,而不是粉红色 + 草)。 @MarcB:我的意思是 for() 中的 $i 可以被 rand()omized【参考方案6】:

几年前我遇到了this class。它可以让您根据种子值生成互补色。

如果您正在寻找更通用的东西,请使用rand(显然低于255)将自己限制在一个通用范围内,并使用base_convert

【讨论】:

【参考方案7】:

我只是限制 rand()-params 的范围:

// full color palette (32 bit)
for($index = 0; $index < 30; $index++)

    echo '<div style="background-color: #' . dechex(rand(0,16777215)) . '; display: inline-block; width: 50px; height: 50px;"></div>';

echo '<br />';

// pastell colors
for($index = 0; $index < 30; $index++)

    echo '<div style="background-color: rgb(' . rand(128,255) . ',' . rand(128,255) . ',' . rand(128,255) . '); display: inline-block; width: 50px; height: 50px;"></div>';

echo '<br />';

// dark colors
for($index = 0; $index < 30; $index++)

    echo '<div style="background-color: rgb(' . rand(0,128) . ',' . rand(0,128) . ',' . rand(0,128) . '); display: inline-block; width: 50px; height: 50px;"></div>';

echo '<br />';

// shades of blue
for($index = 0; $index < 30; $index++)

    echo '<div style="background-color: rgb(' . rand(0,56) . ',' . rand(0,56) . ',' . rand(0,255) . '); display: inline-block; width: 50px; height: 50px;"></div>';

echo '<br />';

// shades of green
for($index = 0; $index < 30; $index++)

    echo '<div style="background-color: rgb(' . rand(0,56) . ',' . rand(0,255) . ',' . rand(0,56) . '); display: inline-block; width: 50px; height: 50px;"></div>';

echo '<br />';

// shades of red
for($index = 0; $index < 30; $index++)

    echo '<div style="background-color: rgb(' . rand(0,255) . ',' . rand(0,56) . ',' . rand(0,56) . '); display: inline-block; width: 50px; height: 50px;"></div>';

【讨论】:

【参考方案8】:

RandomColor 已移植到 PHP,您可以找到它here。有了它,还可以有随机的 light 或随机的 dark 颜色。 示例用法:

include('RandomColor.php');
use \Colors\RandomColor;
// Returns a hex code for a 'truly random' color
RandomColor::one(array(
   'luminosity' => 'random',
   'hue' => 'random'
));
// Returns a hex code for a light blue
RandomColor::one(array(
   'luminosity' => 'light',
   'hue' => 'blue'
));

【讨论】:

【参考方案9】:

另一个简短的版本: 更改 mt_rand(X, Y) 值以生成所需的颜色范围:(0, 255) - 全范围; (180, 255) - 柔和的调色板; (0, 100) - 深色调色板;等等……

function gen_color()
    mt_srand((double)microtime()*1000000); 
    $color_code = '';
    while(strlen($color_code)<6)
        $color_code .= sprintf("%02X", mt_rand(0, 255));
    
    return $color_code;

【讨论】:

【参考方案10】:

试试这个:

//For every hex code
$random = mt_rand(0, 16777215);
$color = "#" . dechex($random);

你可以像这样使用它:

background-color: <?php echo $color ?>;

【讨论】:

【参考方案11】:

如果您想创建外观相似的颜色,使用 HSV 而不是 RGB 会更容易,但您需要在它们之间进行转换。

PHP HSV to RGB formula comprehension

和/或

http://www.brandonheyer.com/2013/03/27/convert-hsl-to-rgb-and-rgb-to-hsl-via-php/

为了获得相似的颜色,您“修复”三个组件中的 2 个并为第三个创建随机值,例如:

function random_color()

    // random hue, full saturation, and slightly on the dark side
    return HSLtoRGB(rand(0,360), 1, 0.3);

【讨论】:

【参考方案12】:

这可能有助于sprintf("%06s\n", strtoupper(dechex(rand(0,10000000))));

【讨论】:

【参考方案13】:
<?php 
function randomColor()
    $rand1 = mt_rand(0, 255);
    $rand2 = mt_rand(0, 255);
    $rand3 = mt_rand(0, 255);
    return "rgb(".$rand1.",".$rand2.",".$rand3.", 0.3)";

【讨论】:

请也写一些解释。 这不能回答所提出的问题。在用现有答案回答旧问题时,请务必指出您的答案所针对的问题的新方面。答案应包括对其工作方式和原因的解释。【参考方案14】:

我使用的这个例子非常有用且简单,它帮助很大。如果有人需要链接和示例。

use \Colors\RandomColor;

// Returns a hex code for an attractive color
RandomColor::one(); 

// Returns an array of ten green colors
RandomColor::many(10, array(
   'hue' => 'green'
));

// Returns a hex code for a light blue
RandomColor::one(array(
   'luminosity' => 'light',
   'hue' => 'blue'
));

// Returns one yellow or blue color
RandomColors::one(array(
    'hue' => array('yellow', 'blue')
));

// Returns a hex code for a 'truly random' color
RandomColor::one(array(
   'luminosity' => 'random',
   'hue' => 'random'
));

// Returns a bright color in RGB
RandomColor::one(array(
   'luminosity' => 'bright',
   'format' => 'rgbCss' // e.g. 'rgb(225,200,20)'
));

在演示中查看结果。 https://www.strangeplanet.fr/work/RandomColor.php/

和作曲家的打包师 https://packagist.org/packages/mistic100/randomcolor

【讨论】:

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

php怎么随机高亮其中一个数组的字体颜色?

生成随机颜色Java [重复]

我正在尝试使用 JavaScript 生成随机颜色代码

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

是否可以使用 Javascript 在页面刷新时随机生成预先确定的链接颜色和悬停颜色?

随机/线性颜色生成器(RandomColorGenerator)