2010-07-12 3 views
1

Comment générer une couleur en fonction de quelle lettre commence une chaîne - peut-être A pourrait être bleu, Z pourrait être vert et les autres lettres seraient le spectre changeant progressivement entre les deux?Générer des couleurs basées sur des lettres en PHP

+1

Quel format de sortie voulez-vous que la couleur soit? CMJN, RVB, HSV, Hex, ...? – Gordon

+0

Salut, HEX ou RGB de préférence mais je peux probablement comprendre comment convertir d'autres formats – usertest

+0

Que voulez-vous dire par * générer une couleur basée sur quelle lettre une chaîne commence par *. Si vous attribuez A à bleu et Z à vert, les lettres b à y seront toujours des dégradés du bleu au vert. Est-ce que c'est ce que tu veux? – Gordon

Répondre

0
$str = iconv("CURRENT CHARSET HERE", "ASCII//TRANSLIT", $orig_string); 
$letter = ucfirst($str); 
//A is 65, Z is 90 
$hue = 2*pi() * ((ord($letter) - 65)/(90-65)); 

C'est vous donnera la teinte en radians. Ensuite, il suffit de choisir une certaine saturation et luminosité et de convertir en RVB ou autre. Voir wikipedia.

0

Vous allez certainement vouloir utiliser HSV, car il est trivial de passer en douceur d'une teinte à l'autre dans cet espace.

Probablement pas le code le plus efficace au monde, mais voilà. Il y a une petite page de test en bas du code que vous pouvez supprimer/ignorer, bien sûr.

<?php 

// RGB_TO_HSV copied from http://www.actionscript.org/forums/showthread.php3?t=50746 

function HSV_TO_RGB ($H, $S, $V) // HSV Values:Number 0-1 
{         // RGB Results:Number 0-255 
    $RGB = array(); 

    if($S == 0) 
    { 
     $R = $G = $B = $V * 255; 
    } 
    else 
    { 
     $var_H = $H * 6; 
     $var_i = floor($var_H); 
     $var_1 = $V * (1 - $S); 
     $var_2 = $V * (1 - $S * ($var_H - $var_i)); 
     $var_3 = $V * (1 - $S * (1 - ($var_H - $var_i))); 

     if  ($var_i == 0) { $var_R = $V  ; $var_G = $var_3 ; $var_B = $var_1 ; } 
     else if ($var_i == 1) { $var_R = $var_2 ; $var_G = $V  ; $var_B = $var_1 ; } 
     else if ($var_i == 2) { $var_R = $var_1 ; $var_G = $V  ; $var_B = $var_3 ; } 
     else if ($var_i == 3) { $var_R = $var_1 ; $var_G = $var_2 ; $var_B = $V  ; } 
     else if ($var_i == 4) { $var_R = $var_3 ; $var_G = $var_1 ; $var_B = $V  ; } 
     else     { $var_R = $V  ; $var_G = $var_1 ; $var_B = $var_2 ; } 

     $R = $var_R * 255; 
     $G = $var_G * 255; 
     $B = $var_B * 255; 
    } 

    $RGB['R'] = $R; 
    $RGB['G'] = $G; 
    $RGB['B'] = $B; 

    return $RGB; 
} 

function getColorForWord($word) { 
    // get the percent of the first letter ranging from 0-1 
    $first_letter_code = (ord(strtolower($word[0]))-97)/25.0; 

    // add a phase depending on where you want to start on the color spectrum 
    // red is 0, green is 0.25, cyan is 0.5, blue is ~0.75, and 1 is back to red 
    $hue = $first_letter_code + 0.25; 

    // you may also want to divide by how much of the spectrum you want to cover 
    // (making the colors range only from green to blue, for instance) 
    // but i'll leave that as an exercise 

    // constrain it to 0-1 
    if ($hue > 1.0) 
     $hue -= 1.0; 

    // the second value is the saturation ("colorfulness", ranging from gray to fully-colored) 
    // the third is the value (brightness) 
    $rgb = HSV_TO_RGB($hue, 1, 0.75); 

    $hexstring = "#"; 

    foreach ($rgb as $c) 
     $hexstring .= str_pad(dechex($c), 2, "0", STR_PAD_LEFT); 

    return $hexstring; 
} 
?> 

<html> 

<head> 
</head> 

<body> 
    <form method="POST" action="<?=$_SERVER["PHP_SELF"]?>"> 
     <input type="text" name="target_word" /> 
     <?php 
     if ($_REQUEST["sub"] && $_REQUEST["target_word"] != "") { 
      print "<span style=\"font-weight: bold; color: ".getColorForWord($_REQUEST["target_word"]).";\">".$_REQUEST["target_word"]."</span>"; 
     } 
     ?> 
     <br /> 

     <input type="submit" name="sub" value="Colorize" /> 
    </form> 
</body> 
0

Je préciserais le code RVB de la première couleur (100100100) et le code RVB de la dernière couleur (200200200) et faire essentiellement

1..25 ​​ B..Y

resultR = firstR + (lastR-firstR) * (1.25/26) resultG = premierG + (lastG-firstG) * (1..25 ​​/ 26) resultB = premierB + (dernierB-premierB) * (1.25/26)

donc B donnerait 100 + étage ((200-100) * (1/26)) 104.104.104

et Y serait de 100 + étage ((200-100) * (1/26)) 196.196.196

Ceci est un code de base, mais il permettra de gradient tous les 3 couleurs, ou seulement 1 (exemple 100,100,100 à 100,100,200) qui ferait un dégradé vers le bleu

Questions connexes