用于将HSL转换为RGB或十六进制的PHP函数

用于将HSL转换为RGB或十六进制的PHP函数,php,css,hsl,Php,Css,Hsl,有人知道PHP函数(for>5.3)可以将HSL颜色转换为RGB或十六进制吗?我已经尝试了十几次谷歌搜索,但我发现没有一个功能像预期的那样有效 函数是否转换为RGB或十六进制并不重要,因为这两者之间的转换非常简单。输入是CSS的HSL值(色调:0-360,饱和度:0-100,亮度:0-100) 编辑:指定输入和输出格式将是一个额外的好处:)从Jim注释()链接中的一个答案中获取代码,我们可以按如下方式计算: <?php $hue = 209; $sat = 75;

有人知道PHP函数(for>5.3)可以将HSL颜色转换为RGB或十六进制吗?我已经尝试了十几次谷歌搜索,但我发现没有一个功能像预期的那样有效

函数是否转换为RGB或十六进制并不重要,因为这两者之间的转换非常简单。输入是CSS的HSL值(色调:0-360,饱和度:0-100,亮度:0-100)


编辑:指定输入和输出格式将是一个额外的好处:)

从Jim注释()链接中的一个答案中获取代码,我们可以按如下方式计算:

<?php    
    $hue = 209;
    $sat = 75;
    $lum = 60;

    $hue /= 360;
    $sat /= 100;
    $lum /= 100;

    $result = ColorHSLToRGB($hue, $sat, $lum);
    var_dump($result); echo '<br>';
    printf("rgb = %d,%d,%d<br>", $result['r'], $result['g'], $result['b']);




function ColorHSLToRGB($h, $s, $l){

        $r = $l;
        $g = $l;
        $b = $l;
        $v = ($l <= 0.5) ? ($l * (1.0 + $s)) : ($l + $s - $l * $s);
        if ($v > 0){
              $m;
              $sv;
              $sextant;
              $fract;
              $vsf;
              $mid1;
              $mid2;

              $m = $l + $l - $v;
              $sv = ($v - $m ) / $v;
              $h *= 6.0;
              $sextant = floor($h);
              $fract = $h - $sextant;
              $vsf = $v * $sv * $fract;
              $mid1 = $m + $vsf;
              $mid2 = $v - $vsf;

              switch ($sextant)
              {
                    case 0:
                          $r = $v;
                          $g = $mid1;
                          $b = $m;
                          break;
                    case 1:
                          $r = $mid2;
                          $g = $v;
                          $b = $m;
                          break;
                    case 2:
                          $r = $m;
                          $g = $v;
                          $b = $mid1;
                          break;
                    case 3:
                          $r = $m;
                          $g = $mid2;
                          $b = $v;
                          break;
                    case 4:
                          $r = $mid1;
                          $g = $m;
                          $b = $v;
                          break;
                    case 5:
                          $r = $v;
                          $g = $m;
                          $b = $mid2;
                          break;
              }
        }
        return array('r' => $r * 255.0, 'g' => $g * 255.0, 'b' => $b * 255.0);
}
?>

PEAR包具有在颜色模型之间转换的方法-请参阅

如果您有十进制RGB值(enhzflep演示了如何获取它们),则可以轻松获取
#ab01cd
十六进制web字符串:

$rgb['r'] = ($t = round($rgb['r'] * 255, 0)) < 15 ? '0'.dechex($t) : dechex($t);
$rgb['g'] = ($t = round($rgb['g'] * 255, 0)) < 15 ? '0'.dechex($t) : dechex($t);
$rgb['b'] = ($t = round($rgb['b'] * 255, 0)) < 15 ? '0'.dechex($t) : dechex($t);
$hexweb = "#".$rgb['r'].$rgb['g'].$rgb['b'];
$rgb['r']=($t=round($rgb['r']*255,0))<150.dechex($t):dechex($t);
$rgb['g']=($t=round($rgb['g']*255,0))<150.dechex($t):dechex($t);
$rgb['b']=($t=round($rgb['b']*255,0))<150.dechex($t):dechex($t);
$hexweb=“#”。$rgb['r']。$rgb['g']。$rgb['b'];
将这些放在一起(这有助于我制作)

/**
*将HSL颜色方案转换为十六进制(默认)或RGB。
* 
*我们需要一种方法,可以通过编程生成一系列颜色
*在两个值之间(如红色到绿色),这很容易用HSL实现,因为
*你只要改变颜色就行了。(0=红色,120=绿色)。你可以使用这个功能
*将这些hsl颜色值转换为rgb或十六进制颜色方案。
*你有
*hsl(50、100%、50%)
*转化,
*$hex=convertHSL(50100,50);//返回#ffd500
*或
*$rgb=convertHSL(50100,50,假);//返回rgb(255、213、0)
*  
*看https://coderwall.com/p/dvsxwg/smoothly-transition-from-green-to-red
*@param int$h色调
*@param int$s饱和度
*@param int$l亮度
*@param bool$toHex是否需要十六进制等效值或rgb等效值
*@返回字符串在HTML或CSS中可用
*/
函数convertHSL($h、$s、$l、$toHex=true){
$h/=360;
$s/=100;
$l/=100;
$r=$l;
$g=$l;
$b=$l;
$v=($l 0){
百万美元;
$sv;
$六分仪;
$fract;
$vsf;
$mid1;
$mid2;
$m=$l+$l-$v;
$sv=($v-$m)/$v;
$h*=6.0;
$六分仪=楼层($h);
$fract=$h-$六分仪;
$vsf=$v*$sv*$fract;
$mid1=$m+$vsf;
$mid2=$v-$vsf;
开关(六分仪)
{
案例0:
$r=$v;
$g=$mid1;
$b=$m;
打破
案例1:
$r=$mid2;
$g=$v;
$b=$m;
打破
案例2:
$r=$m;
$g=$v;
$b=$mid1;
打破
案例3:
$r=$m;
$g=$mid2;
$b=$v;
打破
案例4:
$r=$mid1;
$g=$m;
$b=$v;
打破
案例5:
$r=$v;
$g=$m;
$b=$mid2;
打破
}
}
$r=四舍五入($r*255,0);
$g=圆形($g*255,0);
$b=四舍五入($b*255,0);
如果($toHex){
$r=($r<15)‘0’。十进制($r):十进制($r);
$g=($g<15)‘0’。十进制($g):十进制($g);
$b=($b<15)‘0’。十进制($b):十进制($b);
返回“#$r$g$b”;
}否则{
返回“rgb($r,$g,$b)”;
}
这是我的解决方案

HSV值限制:$H[0-359]、$S[0-100]、$V[0-100]

function hsv_to_rgb($iH, $iS, $iV) {

    if($iH < 0)   $iH = 0;
    if($iH > 360) $iH = 360;
    if($iS < 0)   $iS = 0;
    if($iS > 100) $iS = 100;
    if($iV < 0)   $iV = 0;
    if($iV > 100) $iV = 100;
    $dS = $iS/100.0;
    $dV = $iV/100.0;
    $dC = $dV*$dS;
    $dH = $iH/60.0;
    $dT = $dH;
    while($dT >= 2.0) $dT -= 2.0; // php modulus does not work with float
    $dX = $dC*(1-abs($dT-1));     // as used in the Wikipedia link
    switch($dH) {
      case($dH >= 0.0 && $dH < 1.0):
        $dR = $dC; $dG = $dX; $dB = 0.0; break;
      case($dH >= 1.0 && $dH < 2.0):
        $dR = $dX; $dG = $dC; $dB = 0.0; break;
      case($dH >= 2.0 && $dH < 3.0):
        $dR = 0.0; $dG = $dC; $dB = $dX; break;
      case($dH >= 3.0 && $dH < 4.0):
        $dR = 0.0; $dG = $dX; $dB = $dC; break;
      case($dH >= 4.0 && $dH < 5.0):
        $dR = $dX; $dG = 0.0; $dB = $dC; break;
      case($dH >= 5.0 && $dH < 6.0):
        $dR = $dC; $dG = 0.0; $dB = $dX; break;
      default:
        $dR = 0.0; $dG = 0.0; $dB = 0.0; break;
    }
    $dM  = $dV - $dC;
    $dR += $dM; $dG += $dM; $dB += $dM;
    $dR *= 255; $dG *= 255; $dB *= 255;
    return array(round($dR), round($dG), round($dB));
  }
功能hsv到rgb($iH,$iS,$iV){
如果($iH<0)$iH=0;
如果($iH>360)$iH=360;
如果($iS<0)$iS=0;
如果($iS>100)$iS=100;
如果($iV<0)$iV=0;
如果($iV>100)$iV=100;
$dS=$iS/100.0;
$dV=$iV/100.0;
$dC=$dV*$dS;
$dH=$iH/60.0;
$dT=$dH;
而($dT>=2.0)$dT-=2.0;//php模数不适用于浮点运算
$dX=$dC*(1-abs($dT-1));//在维基百科链接中使用
交换机($dH){
案例($dH>=0.0&$dH<1.0):
$dR=$dC;$dG=$dX;$dB=0.0;中断;
案例($dH>=1.0&$dH<2.0):
$dR=$dX;$dG=$dC;$dB=0.0;中断;
案例($dH>=2.0&$dH<3.0):
$dR=0.0;$dG=$dC;$dB=$dX;中断;
案例($dH>=3.0&$dH<4.0):
$dR=0.0;$dG=$dX;$dB=$dC;中断;
案例($dH>=4.0&$dH<5.0):
$dR=$dX;$dG=0.0;$dB=$dC;中断;
案例($dH>=5.0&$dH<6.0):
$dR=$dC;$dG=0.0;$dB=$dX;中断;
违约:
$dR=0.0;$dG=0.0;$dB=0.0;中断;
}
$dM=$dV-$dC;
$dR+=$dM;$dG+=$dM;$dB+=$dM;
$dR*=255;$dG*=255;$dB*=255;
返回数组(圆形($dR)、圆形($dG)、圆形($dB));
}

我对所有其他实现的测试只显示了奇怪的、可能无法使用的结果。下面是@Mohsen的代码的PHP实现,来自。另外还有一个测试,显示了完整的美

很抱歉交叉发布这篇文章。但我真的没有看到任何其他实现能够提供我所需要的质量

/**
 * Converts an HSL color value to RGB. Conversion formula
 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
 * Assumes h, s, and l are contained in the set [0, 1] and
 * returns r, g, and b in the set [0, 255].
 *
 * @param   {number}  h       The hue
 * @param   {number}  s       The saturation
 * @param   {number}  l       The lightness
 * @return  {Array}           The RGB representation
 */

function hue2rgb($p, $q, $t){
            if($t < 0) $t += 1;
            if($t > 1) $t -= 1;
            if($t < 1/6) return $p + ($q - $p) * 6 * $t;
            if($t < 1/2) return $q;
            if($t < 2/3) return $p + ($q - $p) * (2/3 - $t) * 6;
            return $p;
        }
function hslToRgb($h, $s, $l){
    if($s == 0){
        $r = $l;
        $g = $l;
        $b = $l; // achromatic
    }else{
        $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s;
        $p = 2 * $l - $q;
        $r = hue2rgb($p, $q, $h + 1/3);
        $g = hue2rgb($p, $q, $h);
        $b = hue2rgb($p, $q, $h - 1/3);
    }

    return array(round($r * 255), round($g * 255), round($b * 255));
}

/* Uncomment to test * /
for ($i=0;$i<360;$i++) {
  $rgb=hslToRgb($i/360, 1, .9);
  echo '<div style="background-color:rgb(' .$rgb[0] . ', ' . $rgb[1] . ', ' . $rgb[2] . ');padding:2px;"></div>';
}
/* End Test */
/**
*将HSL颜色值转换为RGB。转换公式
*改编自http://en.wikipedia.org/wiki/HSL_color_space.
*假设h、s和l包含在集合[0、1]中,并且
*返回集合[0255]中的r、g和b。
*
*@param{number}h色调
*@param{number}是饱和度
*@param{number}l明度
*@return{Array}RGB表示法
*/
函数hue2rgb($p、$q、$t){
如果($t<0)$t+=1;
function hsv_to_rgb($iH, $iS, $iV) {

    if($iH < 0)   $iH = 0;
    if($iH > 360) $iH = 360;
    if($iS < 0)   $iS = 0;
    if($iS > 100) $iS = 100;
    if($iV < 0)   $iV = 0;
    if($iV > 100) $iV = 100;
    $dS = $iS/100.0;
    $dV = $iV/100.0;
    $dC = $dV*$dS;
    $dH = $iH/60.0;
    $dT = $dH;
    while($dT >= 2.0) $dT -= 2.0; // php modulus does not work with float
    $dX = $dC*(1-abs($dT-1));     // as used in the Wikipedia link
    switch($dH) {
      case($dH >= 0.0 && $dH < 1.0):
        $dR = $dC; $dG = $dX; $dB = 0.0; break;
      case($dH >= 1.0 && $dH < 2.0):
        $dR = $dX; $dG = $dC; $dB = 0.0; break;
      case($dH >= 2.0 && $dH < 3.0):
        $dR = 0.0; $dG = $dC; $dB = $dX; break;
      case($dH >= 3.0 && $dH < 4.0):
        $dR = 0.0; $dG = $dX; $dB = $dC; break;
      case($dH >= 4.0 && $dH < 5.0):
        $dR = $dX; $dG = 0.0; $dB = $dC; break;
      case($dH >= 5.0 && $dH < 6.0):
        $dR = $dC; $dG = 0.0; $dB = $dX; break;
      default:
        $dR = 0.0; $dG = 0.0; $dB = 0.0; break;
    }
    $dM  = $dV - $dC;
    $dR += $dM; $dG += $dM; $dB += $dM;
    $dR *= 255; $dG *= 255; $dB *= 255;
    return array(round($dR), round($dG), round($dB));
  }
/**
 * Converts an HSL color value to RGB. Conversion formula
 * adapted from http://en.wikipedia.org/wiki/HSL_color_space.
 * Assumes h, s, and l are contained in the set [0, 1] and
 * returns r, g, and b in the set [0, 255].
 *
 * @param   {number}  h       The hue
 * @param   {number}  s       The saturation
 * @param   {number}  l       The lightness
 * @return  {Array}           The RGB representation
 */

function hue2rgb($p, $q, $t){
            if($t < 0) $t += 1;
            if($t > 1) $t -= 1;
            if($t < 1/6) return $p + ($q - $p) * 6 * $t;
            if($t < 1/2) return $q;
            if($t < 2/3) return $p + ($q - $p) * (2/3 - $t) * 6;
            return $p;
        }
function hslToRgb($h, $s, $l){
    if($s == 0){
        $r = $l;
        $g = $l;
        $b = $l; // achromatic
    }else{
        $q = $l < 0.5 ? $l * (1 + $s) : $l + $s - $l * $s;
        $p = 2 * $l - $q;
        $r = hue2rgb($p, $q, $h + 1/3);
        $g = hue2rgb($p, $q, $h);
        $b = hue2rgb($p, $q, $h - 1/3);
    }

    return array(round($r * 255), round($g * 255), round($b * 255));
}

/* Uncomment to test * /
for ($i=0;$i<360;$i++) {
  $rgb=hslToRgb($i/360, 1, .9);
  echo '<div style="background-color:rgb(' .$rgb[0] . ', ' . $rgb[1] . ', ' . $rgb[2] . ');padding:2px;"></div>';
}
/* End Test */
/**
 * convert user email to hsl for user avatar
 * @param string $string
 * @return string HEX color code
 */
function stringToColor($string)
{
    $hash = 0;
    $l = 70;
    $s = 60;
    for ($i = 0; $i < strlen($string); $i++) {
        $hash = ord($string[$i]) + (($hash << 5) - $hash);
    }
    $h = fmod($hash, 360);
    return $this->hslToHex($h, $s, $l, true);
}

/**
 * Converts HSL to Hex by converting it to 
 * RGB, then converting that to hex.
 * 
 * string hslToHex($h, $s, $l[, $prependPound = true]
 * 
 * $h is the Degrees value of the Hue
 * $s is the Percentage value of the Saturation
 * $l is the Percentage value of the Lightness
 * $prependPound is a bool, whether you want a pound 
 *  sign prepended. (optional - default=true)
 *
 * Calls: 
 *   hslToRgb
 *
 * Output: Hex in the format: #00ff88 (with 
 * pound sign).  Rounded to the nearest whole
 * number.
 */
function hslToHex($h, $s, $l, $prependPound = true)
{
    //convert hsl to rgb
    $rgb = $this->hslToRgb($h, $s, $l);

    //convert rgb to hex
    $hexR = $rgb['r'];
    $hexG = $rgb['g'];
    $hexB = $rgb['b'];

    //round to the nearest whole number
    $hexR = round($hexR);
    $hexG = round($hexG);
    $hexB = round($hexB);

    //convert to hex
    $hexR = dechex($hexR);
    $hexG = dechex($hexG);
    $hexB = dechex($hexB);

    //check for a non-two string length
    //if it's 1, we can just prepend a
    //0, but if it is anything else non-2,
    //it must return false, as we don't 
    //know what format it is in.
    if (strlen($hexR) != 2) {
        if (strlen($hexR) == 1) {
            //probably in format #0f4, etc.
            $hexR = "0" . $hexR;
        } else {
            //unknown format
            return false;
        }
    }
    if (strlen($hexG) != 2) {
        if (strlen($hexG) == 1) {
            $hexG = "0" . $hexG;
        } else {
            return false;
        }
    }
    if (strlen($hexB) != 2) {
        if (strlen($hexB) == 1) {
            $hexB = "0" . $hexB;
        } else {
            return false;
        }
    }

    //if prependPound is set, will prepend a
    //# sign to the beginning of the hex code.
    //(default = true)
    $hex = "";
    if ($prependPound) {
        $hex = "#";
    }

    $hex = $hex . $hexR . $hexG . $hexB;

    return $hex;
}
/**
 * Converts an HSL color value to RGB. Conversion formula
 * adapted from http://www.niwa.nu/2013/05/math-behind-colorspace-conversions-rgb-hsl/.
 * Assumes h, s, and l are in the format Degrees,
 * Percent, Percent, and returns r, g, and b in 
 * the range [0 - 255].
 *
 * Called by hslToHex by default.
 *
 * Calls: 
 *   degPercPercToHsl
 *   hueToRgb
 *
 * @param   Number  h       The hue value
 * @param   Number  s       The saturation level
 * @param   Number  l       The luminence
 * @return  Array           The RGB representation
 */
function hslToRgb($h, $s, $l)
{
    //convert the hue's 360 degrees in a circle to 1
    $h /= 360;
    //convert the saturation and lightness to the 0-1 
    //range by multiplying by 100
    $s /= 100;
    $l /= 100;

    //If there's no saturation, the color is a greyscale,
    //so all three RGB values can be set to the lightness.
    //(Hue doesn't matter, because it's grey, not color)
    if ($s == 0) {
        $r = $l * 255;
        $g = $l * 255;
        $b = $l * 255;
    } else {
        //calculate some temperary variables to make the 
        //calculation eaisier.
        if ($l < 0.5) {
            $temp2 = $l * (1 + $s);
        } else {
            $temp2 = ($l + $s) - ($s * $l);
        }
        $temp1 = 2 * $l - $temp2;

        //run the calculated vars through hueToRgb to
        //calculate the RGB value.  Note that for the Red
        //value, we add a third (120 degrees), to adjust 
        //the hue to the correct section of the circle for
        //red.  Simalarly, for blue, we subtract 1/3.
        $r = 255 * $this->hueToRgb($temp1, $temp2, $h + (1 / 3));
        $g = 255 * $this->hueToRgb($temp1, $temp2, $h);
        $b = 255 * $this->hueToRgb($temp1, $temp2, $h - (1 / 3));
    }
    $rgb['r'] = $r;
    $rgb['g'] = $g;
    $rgb['b'] = $b;
    return $rgb;
    // return "rgb($r, $g, $b)";
}
/**
 * Converts an HSL hue to it's RGB value.  
 *
 * Input: $temp1 and $temp2 - temperary vars based on 
 * whether the lumanence is less than 0.5, and 
 * calculated using the saturation and luminence
 * values.
 *  $hue - the hue (to be converted to an RGB 
 * value)  For red, add 1/3 to the hue, green 
 * leave it alone, and blue you subtract 1/3 
 * from the hue.
 *
 * Output: One RGB value.
 *
 * Thanks to Easy RGB for this function (Hue_2_RGB).
 * http://www.easyrgb.com/index.php?X=MATH&$h=19#text19
 *
 */
function hueToRgb($temp1, $temp2, $hue)
{
    if ($hue < 0) {
        $hue += 1;
    }
    if ($hue > 1) {
        $hue -= 1;
    }

    if ((6 * $hue) < 1) {
        return ($temp1 + ($temp2 - $temp1) * 6 * $hue);
    } elseif ((2 * $hue) < 1) {
        return $temp2;
    } elseif ((3 * $hue) < 2) {
        return ($temp1 + ($temp2 - $temp1) * ((2 / 3) - $hue) * 6);
    }
    return $temp1;
}