2012-07-31 31 views
1

好的,我写了一个函数,应该将HSL颜色值转换为RGB。我照着这个脚本在PHP重写它:http://www.easyrgb.com/index.php?X=MATH&H=19#text19HSL为什么不是这个RGB转换函数的工作原理?

这是我有:

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的参考脚本中完美地调整了它。我只是不知道为什么它不工作。任何帮助都是极好的。谢谢。

回答

2

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

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

您的PHP代码可能有错误。

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

你为什么要使用$ SH变量: 在你的代码的开头添加这些行?您指向的算法仅使用vH。尝试用$vH替换全部$sH

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

有一个这样的fonction在这里评论: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); 
} 
+0

尼斯赶上,但它并没有解决问题。 – nkcmr 2012-07-31 01:45:22

+0

我建议了其他的东西,看我的答案中的更新。 – Jocelyn 2012-07-31 01:46:47

+0

我将其添加到代码中。没有错误。 – nkcmr 2012-07-31 01:50:18

相关问题