PHP生成RGB

8
我遇到了这样的情况:我有一个来自数据库的ID(可以是1、100、1000等),我需要生成随机颜色,但相同的ID应该产生相同的颜色。
您有什么建议吗?
谢谢!

你有写过任何代码(或伪代码)吗? - summea
关于位拆分怎么样?R的Bit0->Bit7,G的Bit1->Bit7,B的Bit2->Bit7,R的Bit3->Bit6...虽然这很复杂,但只要ID空间不太大,它可以产生非常不同的颜色。 - Eugen Rieck
4个回答

37

使用加密哈希函数并截取您不需要的字节:

function getColor($num) {
    $hash = md5('color' . $num); // modify 'color' to get a different palette
    return array(
        hexdec(substr($hash, 0, 2)), // r
        hexdec(substr($hash, 2, 2)), // g
        hexdec(substr($hash, 4, 2))); //b
}

下面是生成此图片的代码(点此查看),对于0-20的数字,效果如下:

演示输出


3
<?php 
// someting like this?
$randomString = md5($your_id_here); // like "d73a6ef90dc6a ..."
$r = substr($randomString,0,2); //1. and 2.
$g = substr($randomString,2,2); //3. and 4.
$b = substr($randomString,4,2); //5. and 6.
?>
<style>
#topbar { border-bottom:4px solid #<?php echo $r.$g.$b;  ?>; }
</style>

1

显而易见的方法是将ID转换为颜色(例如,低8位是蓝色,接下来的8位是绿色,再接下来的8位是红色-留下8位,但我相信你可以想出来的;-)

假设这种方法不起作用(因为你最终会得到一个可怕的调色板: 使用数组(或哈希表)将ID映射到颜色。

如果您担心有太多的ID,则可以对ID应用一些哈希,并将其用作“ID到颜色”映射中的键。在这种情况下,您实际上是在说一个ID始终具有一种颜色,但是一种颜色可以被许多ID使用。


0
如果数组始终有序,您可以使用该算法处理多达250个项目:
<?php
function getRGBColorString( $array )
{
    $indexColor = round( 250 / count( $array ) );
    $iterator = 1;

    $arrayOfRGB = array();

    foreach( $array as $item)
    {   
        $arrayOfRGB[] = "rgb(" . ( $indexColor * $iterator ) . ", 113, 113 )";
        $iterator++;
    }  

    return $arrayOfRGB;
}

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接