<?PHP
/*
Title: RGB_2_HSB_2_RGB_Converter
Description: Converting a given (HEX)-RGB-value into HSB and backwards
Copyright: Copyright © 2002, 2003
Company: twistdesign GbR
Author: Jürn-Christian Hocke
Version: 1.0a
*/
$RGB = Array();
$HSL = Array();
$k = 0;
$hex = Array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F");
for ($i = 0; $i < 16; $i++)
{
for ($j = 0; $j < 16; $j++)
{
$RGB[$k] = $hex[$i] + $hex[$j];
$k++;
}
}
function HextoDec($strHex)
{
$intMax = 6;
if(strlen($strHex) <= $intMax)
{
$e = array();
$z = array("0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F");
$d = 0;
$chk = 0;
$strHex = strtoupper($strHex);
for($i=0;$i<strlen($strHex);$i++)
{
for($j=0;$j<=16;$j++)
{
if(substr($strHex,$i,$i+1) == $z[$j])
{
$chk = 1;
$e[$i] = $j;
}
}
if($chk == 0) echo "unerlaubte Ziffer!";
}
for($i=0;$i<strlen($strHex);$i++) $d = $d + $e[$i] * pow(16,(strlen($strHex)-$i-1));
}
else $d = "zu lange ziffer";
return($d);
}
function HSLtoRGB($H,$S,$L) {
$p1;
$p2;
$rgb = Array();
$L/=100;
$S/=100;
if ($L<=0.5) $p2=$L*(1+$S);
else $p2=$L+$S-($L*$S);
$p1=2*$L-$p2;
if ($S==0)
{
$rgb["r"] = $L;
$rgb["g"] = $L;
$rgb["b"] = $L;
}
else
{
$rgb["r"]=FindRGB($p1,$p2,$H+120);
$rgb["g"]=FindRGB($p1,$p2,$H);
$rgb["b"]=FindRGB($p1,$p2,$H-120);
}
$rgb["r"] *= 255;
$rgb["g"] *= 255;
$rgb["b"] *= 255;
$rgb["r"]=round($rgb["r"]);
$rgb["g"]=round($rgb["g"]);
$rgb["b"]=round($rgb["b"]);
$strRGB = $rgb["r"].",".$rgb["g"].",".$rgb["b"];
return $strRGB;
}
function FindRGB($q1,$q2,$hue)
{
if ($hue>360) $hue=$hue-360;
if ($hue<0) $hue=$hue+360;
if ($hue<60) return ($q1+($q2-$q1)*$hue/60);
else if ($hue<180) return($q2);
else if ($hue<240) return($q1+($q2-$q1)*(240-$hue)/60);
else return($q1);
}
function RGBtoHSL($r,$g,$b)
{
global $HSL;
$Min=0;
$Max=0;
$r=($r/51)*0.2;
$g=($g/51)*0.2;
$b=($b/51)*0.2;
if ($r>=$g) $Max=$r;
else $Max=$g;
if ($b>$Max) $Max=$b;
if ($r<=$g) $Min=$r;
else $Min=$g;
if ($b<$Min) $Min=b;
$HSL[2]=($Max+$Min)/2;
if ($Max==$Min)
{
$HSL[1]=0;
$HSL[0]=0;
}
else
{
if ($HSL[2] < 0.5) $HSL[1] = ($Max-$Min)/($Max+$Min);
if ($HSL[2] >= 0.5) $HSL[1] = ($Max-$Min)/(2-$Max-$Min);
if ($r==$Max) $HSL[0] = ($g-$b)/($Max-$Min);
if ($g==$Max) $HSL[0] = 2+(($b-$r)/($Max-$Min));
if ($b==$Max) $HSL[0] = 4+(($r-$g)/($Max-$Min));
}
$HSL[0] = round($HSL[0]*60);
if($HSL[0]<0) $HSL[0] += 360;
if($HSL[0]>=360) $HSL[0] -= 360;
$HSL[1] = round($HSL[1]*100);
$HSL[2] = round($HSL[2]*100); // eigentliches HSB ist noch *2 - keine ahnung, warum es nur so funzt ... liegt wohl an HSL
}
$hexr = '00';
$hexg = '66';
$hexb = '99';
$decr = HextoDec($hexr);
$decg = HextoDec($hexg);
$decb = HextoDec($hexb);
RGBtoHSL($decr,$decg,$decb);
make_dropshadow($HSL,20);
$newrgb = HSLtoRGB($HSL[0],$HSL[1],$HSL[2]);
echo $hexr."|".$hexg."|".$hexb."->".$decr."|".$decg."|".$decb."->".$HSL[0]."|".$HSL[1]."|".$HSL[2]."->".$newrgb;