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