2010-09-16 7 views
15

Me gustaría representar las cadenas como colores html arbitrarios.¿Cómo puedo convertir cadenas a un hash de código de color html?

Ejemplo:

"bla bla" = # FFCC00
"Foo Foo 2" = # 565656

No importa lo que el código de color real es, siempre y cuando se trata de un hexadecimal válido El código de color HTML y todo el espectro está bastante bien representado.

Supongo que el primer paso sería hacer un MD5 en la cadena y luego convertirlo de alguna manera en código de color hexadecimal?

Actualización: El ejemplo de uso consiste en generar un informe visual de las solicitudes de archivos en un servidor. Los colores no tienen que verse bonitos, es más que un cerebro humano puede detectar patrones, etc. en los datos más fácilmente.

+0

¿Desea asignar una cadena a un código hexadecimal de 6 dígitos? – codaddict

+0

¿Puedes dar un ejemplo de cómo usarías estas cadenas? ¿Por qué no pones los códigos de color en las variables de php? – Mischa

+1

yendo con el pensamiento de codaddict: hash y toma los primeros 6 bytes? – russau

Respuesta

30

Gracias por los punteros, esto parece hacer un trabajo competente:

function stringToColorCode($str) { 
    $code = dechex(crc32($str)); 
    $code = substr($code, 0, 6); 
    return $code; 
} 

$str = 'test123'; 
print '<span style="background-color:#'.stringToColorCode($str).'">'.$str.'</span>'; 
+0

exactamente la solución que estaba buscando. –

+1

Se proporcionó un concepto similar pero con hash diferente aquí: http://stackoverflow.com/questions/15704220/change-random-strings-into-colours-consistently Para mí, parecía proporcionar una combinación de colores más variada. Tal vez la distribución de hash es diferente para md5() vs dechex (crc32()) – kane

+0

Perfecto. ¡Funciona genial! Gracias. – Steffi

16

Casi siempre, simplemente utilizando los colores al azar se

  1. quedar mal conflictos
  2. con el fondo

Yo recomendaría la creación de una lista (alargada) de colores que funcionan bien juntos y con su fondo - luego solo sume los valores de char de la cuerda y el módulo (%) con su número de colores para obtener un índice en la tabla.

+1

Esta es la mejor respuesta. Debe incluir una función para que se complete. – Heroselohim

16

Estoy de acuerdo con sje397 que los colores completamente aleatorios podrían terminar pareciendo desagradables. En lugar de hacer una larga lista de colores bonitos, sugeriría elegir un valor constante de saturación + luminiscencia y variar el tono en función del contenido. Para obtener un color RGB de un color HSL, puede usar algo similar a lo que se describe en http://en.wikipedia.org/wiki/HSL_and_HSV#Converting_to_RGB.

He aquí un ejemplo (probarlo en http://codepad.viper-7.com algo que funciona, como https://codepad.remoteinterview.io/ZXBMZWYJFO):

<?php 

function hsl2rgb($H, $S, $V) { 
    $H *= 6; 
    $h = intval($H); 
    $H -= $h; 
    $V *= 255; 
    $m = $V*(1 - $S); 
    $x = $V*(1 - $S*(1-$H)); 
    $y = $V*(1 - $S*$H); 
    $a = [[$V, $x, $m], [$y, $V, $m], 
      [$m, $V, $x], [$m, $y, $V], 
      [$x, $m, $V], [$V, $m, $y]][$h]; 
    return sprintf("#%02X%02X%02X", $a[0], $a[1], $a[2]); 
} 

function hue($tstr) { 
    return unpack('L', hash('adler32', $tstr, true))[1]; 
} 

$phrase = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua."; 
$words = []; 
foreach (explode(' ', $phrase) as $word) 
    $words[hue($word)] = $word; 
ksort($words); 
foreach ($words as $h => $word) { 
    $col = hsl2rgb($h/0xFFFFFFFF, 0.4, 1); 
    printf('<span style="color:%s">%s</span> ', $col, $word); 
} 
?> 
+4

Con un fragmento de código, esta sería la mejor respuesta – iwein

+0

Agregó el fragmento de código. – Reinderien

+0

Error de PHP Parse: error de sintaxis, inesperado '[' después de $ a debido a la versión anterior de PHP. – hozza

0

Creo que entiendo muy bien el deseo. Yo quería lo mismo. Intentando obtener un color de fondo único que represente un título. No quería predefinir nada, quería obtener un hash visual para cada título, pero con bondad. Encontré esto para hacer el trabajo bastante bien. Puede modificar el brillo de los colores y las variaciones de lo que devuelve. Simplemente prueba con los colores con los que te sientes cómodo. Creo que cualquier color debería ser bueno para este trabajo, solo que el brillo importa distinguirlo del primer plano.

https://mrkmg.com/blog/2012/01/13/php-function-to-generate-a-color-from-a-text-string/

Darle una cadena, brillo mínimo (0-255) y una varianza (2-10) y generará un color para su cadena. Este puede darte lindos colores si los pones.

+0

El enlace está roto :( – Jerry

2

Un forro:

substr(md5($string), 0, 6); 
Cuestiones relacionadas