【问题标题】:why isn't this HSL to RGB conversion function working?为什么这个 HSL 到 RGB 转换功能不起作用?
【发布时间】:2012-07-28 17:42:38
【问题描述】:

好的,我已经编写了一个函数,可以将 HSL 颜色值转换为 RGB。我已经根据这个脚本用 PHP 重写了它:http://www.easyrgb.com/index.php?X=MATH&H=19#text19

这就是我所拥有的:

function HSL2RGB($h, $s, $l){
    function hue2rgb($v1, $v2, $vH){
        $sH = $vH;
        if($vH<0) $sH += 1;
        if($vH>1) $sH -= 1;
        if((6*$sH)<1) return $v1+($v2-$v1)*6*$sH;
        if((2*$sH)<1) return $v2;
        if((3*$sH)<2) return $v1+($v2-$v1)*((2/3)-$sH)*6;
        return $v1;
    }

    $h *= (5/18);
    $s /= 100;
    $l /= 100;
    $r=$g=$b=NULL;
    if($s==0){
        $r=$l*255;
        $g=$l*255;
        $b=$l*255;
    }else{
        if($l<0.5)
            $var_2 = $l*(1+$s);
        else
            $var_2 = ($l+$s)-($s*$l);

        $var_1 = 2*$l-$var_2;
        $r = 255*hue2rgb($var_1, $var_2, $h+(1/3));
        $g = 255*hue2rgb($var_1, $var_2, $h);
        $b = 255*hue2rgb($var_1, $var_2, $h-(1/3));
    }
    return array('r'=>$r,'g'=>$g,'b'=>$b);
}

var_dump(HSL2RGB(196.4, 100, 59.8));

这个脚本的输出:

array(3) {
  ["r"]=>
  float(49.98)
  ["g"]=>
  float(49.98)
  ["b"]=>
  float(49.98)
}

正确的输出是R: 50, G:199, B:255。我从easyrgb.com 的参考脚本中完美地改编了它。我只是不知道为什么它不起作用。任何帮助都是极好的。谢谢。

【问题讨论】:

    标签: php colors rgb hsl


    【解决方案1】:

    根据PHP manual,PHP 中的变量名区分大小写。

    在您的代码中将 $sh 更改为 $sH

    您的 PHP 代码可能有错误。 在代码的开头添加这些行:

    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    

    你为什么使用 $sH 变量?您指向的算法仅使用vH。尝试将所有$sH 替换为$vH

    在您的原始代码中,将 $h *= (5/18) 更改为 $h /= 360; 将修复您的功能。

    这里的 cmets 中有一个这样的函数:http://php.net/manual/en/function.imagecolorallocate.php

    function hslToRgb ($h, $s, $l) {
        if ($h>240 || $h<0) return array(0,0,0);
        if ($s>240 || $s<0) return array(0,0,0);
        if ($l>240 || $l<0) return array(0,0,0);    
        if ($h<=40) {
            $R=255;
            $G=(int)($h/40*256);
            $B=0;
        }
        elseif ($h>40 && $h<=80) {
            $R=(1-($h-40)/40)*256;
            $G=255;
            $B=0;
        }
        elseif ($h>80 && $h<=120) {
            $R=0;
            $G=255;
            $B=($h-80)/40*256;
        }
        elseif ($h>120 && $h<=160) {
            $R=0;
            $G=(1-($h-120)/40)*256;
            $B=255;
        }
        elseif ($h>160 && $h<=200) {
            $R=($h-160)/40*256;
            $G=0;
            $B=255;
        }
        elseif ($h>200) {
            $R=255;
            $G=0;
            $B=(1-($h-200)/40)*256;
        }
        $R=$R+(240-$s)/240*(128-$R);
        $G=$G+(240-$s)/240*(128-$G);
        $B=$B+(240-$s)/240*(128-$B);
        if ($l<120) {
            $R=($R/120)*$l;
            $G=($G/120)*$l;
            $B=($B/120)*$l;
        }
        else {
            $R=$l*((256-$R)/120)+2*$R-256;
            $G=$l*((256-$G)/120)+2*$G-256;
            $B=$l*((256-$B)/120)+2*$B-256;
        }
        if ($R<0) $R=0;
        if ($R>255) $R=255;
        if ($G<0) $G=0;
        if ($G>255) $G=255;
        if ($B<0) $B=0;
        if ($B>255) $B=255;
    
        return array((int)$R,(int)$G,(int)$B);
    } 
    

    【讨论】:

    • 我添加了关于 $vH 和 $sH 的另一件事。
    • 好的,该算法也不起作用,我完美地复制并粘贴了它。
    • 好吧,与其使用(5/18)来调低hue参数,正确的方法是使用$h /= 360;把它放在你的答案中,我会给你正确的答案以帮助你非常!非常感谢。
    • 在被其他人拒绝后,我看到了您的编辑请求。我用你说的那句话编辑了我的答案。我保留其他功能,以防其他人发现它有帮助。
    猜你喜欢
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    相关资源
    最近更新 更多