为什么这个HSL到RGB转换功能不起作用?

时间:2012-07-31 01:33:11

标签: php colors rgb hsl

好的,我编写了一个将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的参考脚本中完美地调整了它。我只是想不通为什么它不起作用。任何帮助都是极好的。谢谢。

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

这里的评论中有一个这样的功能: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);
}