2012-02-08 13 views
6

Me enfrento a esta situación en la que tengo un ID que proviene de una base de datos (por lo que puede ser 1, 100, 1000, ...) y necesito generar colores aleatorios, sin embargo, ID iguales debería resultar en el mismo color.PHP generar RGB

¿Alguna sugerencia sobre cómo puedo lograr esto?

Gracias!

+0

¿Tiene algún código (o pseudocódigo) escrito hasta el momento? – summea

+0

¿Qué hay de la división de bits? Bit0-> Bit7 de R, Bit1-> Bit7 de G, Bit2-> Bit7 de B, Bit3-> Bit6 de R, ... aunque es complicado, da colores muy diferentes, siempre que el espacio de ID no sea demasiado grande. –

Respuesta

25

utilizar un hash criptográfico y recortar los bytes que no es necesario:

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 
} 

La resultante (code to generate it) tiene este aspecto para los números 0-20:

demo output

1

El enfoque obvio es simplemente convertir el ID en un color (por ejemplo, 8 bits más bajos son el azul, los 8 bits siguientes son verdes, los 8 siguientes son rojos, deje 8 bits, pero estoy seguro de que puede averiguarlo ;-)

Suponiendo que esto no funciona (cos se termina con una paleta de colores abrasador. utilizar una matriz (o tabla hash) para hacer un mapeo de identificadores de colores

Si está preocupado que hay demasiadas identificaciones, entonces podría aplicar algo de hash a la ID y usarlo como clave en el mapeo "id to color". En este caso, efectivamente está diciendo que una identificación siempre tiene un color, pero un color puede ser utilizado por muchos ID.

1
<?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> 
0

Si el conjunto está siempre ordenado, puede usar este algoritmo hasta 250 elementos:

<?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; 
} 

?>