Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中基于字母生成颜色_Php_Colors - Fatal编程技术网

在PHP中基于字母生成颜色

在PHP中基于字母生成颜色,php,colors,Php,Colors,我如何根据字符串的起始字母生成颜色——也许a可以是蓝色,Z可以是绿色,而其他字母则是介于两者之间逐渐变化的光谱 试试这个功能: 这将以弧度为单位显示色调。然后,只需选择一个特定的饱和度和亮度,然后转换为RGB或其他颜色。请参阅。您肯定会想使用HSV,因为在该空间中从一种色调平滑过渡到另一种色调是很简单的 也许不是世界上最有效的代码,但这里是。当然,在代码的底部有一个小测试页,您可以删除/忽略它 <?php // RGB_TO_HSV copied from http://www.a

我如何根据字符串的起始字母生成颜色——也许a可以是蓝色,Z可以是绿色,而其他字母则是介于两者之间逐渐变化的光谱

试试这个功能:


这将以弧度为单位显示色调。然后,只需选择一个特定的饱和度和亮度,然后转换为RGB或其他颜色。请参阅。

您肯定会想使用HSV,因为在该空间中从一种色调平滑过渡到另一种色调是很简单的

也许不是世界上最有效的代码,但这里是。当然,在代码的底部有一个小测试页,您可以删除/忽略它

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

我会指定第一种颜色的RGB代码(100100100)和最后一种颜色的RGB代码(200200),基本上

1..25 B..Y

结果r=firstR+(lastR-firstR)*(1..25/26) 结果G=firstG+(lastG firstG)*(1..25/26) 结果B=firstB+(lastB firstB)*(1..25/26)

所以B会给出100+楼层((200-100)*(1/26)) 104104

Y是100+层((200-100)*(1/26)) 196


这是一个基本代码,但它将允许所有3种颜色的渐变,或者只允许1种颜色(例如100100100到100100200)向蓝色渐变

基于将前六个字母字符(包括空格)转换为相关的十六进制字符的想法,我提出了这个更简单的解决方案。对于十六进制,有助于了解(例如#123456),如果更改1和2,它将在接近零的值处变得更蓝,在接近F的值处变得更白。如果更改3和4,它将在接近零的值处变得更品红色,对于F的值,白色会变多。如果你改变5和6,在接近0的值时,白色会变多,而对于F的值,白色会变多。做了这个之后,我还尝试使用类似的策略来计算互补颜色(适合背景)。但是十六进制的中间值很难变成灰色(7,8)

$word=“word 1”;
$letter=substr(strtolower($word),0,6);
$i=0;
$hd=“#””;

虽然($I您希望颜色是什么输出格式?CMYK、RGB、HSV、Hex……?最好是Hi、Hex或RGB,但我可能知道如何转换其他格式。根据字符串开头的字母生成颜色是什么意思。如果将a指定为蓝色,Z指定为绿色,则字母b到y将始终是从蓝色到绿色的渐变。这就是你想要的吗?
<?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>
$word="word 1";
$letter = substr(strtolower($word), 0,6);
$i=0;
$hd="#";
while ($i<=5){
$l2=substr($letter,$i,1);
if($l2=="a" || $l2=="b"){$hd=$hd."0";}
elseif($l2=="c" || $l2=="d"){$hd=$hd."1";}
elseif($l2=="e"){$hd=$hd."2";}
elseif($l2=="f" || $l2=="g"){$hd=$hd."3";}
elseif($l2=="h" || $l2=="i"){$hd=$hd."4";}
elseif($l2=="j"){$hd=$hd."5";}
elseif($l2=="k" || $l2=="l"){$hd=$hd."6";}
elseif($l2=="m" || $l2=="n"){$hd=$hd."7";}
elseif($l2=="o"){$hd=$hd."8";}
elseif($l2=="p" || $l2=="q"){$hd=$hd."9";}
elseif($l2=="r" || $l2=="s"){$hd=$hd."A";}
elseif($l2=="t"){$hd=$hd."B";}
elseif($l2=="u" || $l2=="v"){$hd=$hd."C";}
elseif($l2=="w" || $l2=="x"){$hd=$hd."D";}
elseif($l2=="y"){$hd=$hd."E";}
elseif($l2=="z" || $l2==" " || $l2==""){$hd=$hd."F";}
$i++;
}
//calculating the complimentary colour
$o=1;
$comp="#";
while($o<=6){
$see=substr($hd,$o,1);
if($see=="F"){$comp=$comp."0";}
elseif($see=="E"){$comp=$comp."1";}
elseif($see=="D"){$comp=$comp."2";}
elseif($see=="C"){$comp=$comp."3";}
elseif($see=="B"){$comp=$comp."4";}
elseif($see=="A"){$comp=$comp."5";}
elseif($see=="9"){$comp=$comp."F";}
elseif($see=="8"){$comp=$comp."0";}
elseif($see=="7"){$comp=$comp."F";}
elseif($see=="6"){$comp=$comp."0";}
elseif($see=="5"){$comp=$comp."F";}
elseif($see=="4"){$comp=$comp."B";}
elseif($see=="3"){$comp=$comp."C";}
elseif($see=="2"){$comp=$comp."D";}
elseif($see=="1"){$comp=$comp."E";}
elseif($see=="0"){$comp=$comp."F";}
$o++;
}
echo" hexadecimal is $hd, complimentary colour is $comp";