Array
(
[0] => 0
[1] => 1
[2] => 1
)
Array
(
[0] => 255
[1] => 0
[2] => 1
)
// r,g,b values are from 0 to 1
// h = [0,360], s = [0,1], v = [0,1]
// if s == 0, then h = -1 (undefined)
function RGBtoHSV($r,$g,$b)
{
//make it use rgb=[0,255]
$r/=255;
$g/=255;
$b/=255;
$v = max($r,$g,$b);
$delta = $v - min($r,$g,$b);
if($v==0)
{
//black
// r = g = b = 0
// s = 0, v is undefined
$s = 0;
$h = -1;
}
elseif($delta==0)
{
//grey
// r = g = b
// s = 0
$s = 0;
$h = -1;
}
else
{
//color
$s = $delta / $v; // s
if( $r == $v ) $h = ( $g - $b ) / $delta; // between yellow & magenta
else if( $g == $v ) $h = 2 + ( $b - $r ) / $delta; // between cyan & yellow
else $h = 4 + ( $r - $g ) / $delta; // between magenta & cyan
$h *= 60; // degrees
if( $h < 0 ) $h += 360;
}
return array($h,$s,$v);
};
function HSVtoRGB($h,$s,$v)
{
$i=0;$f=0;$p=0;$q=0;$t=0;
if( $s == 0 ) {
// achromatic (grey)
$r = $g = $b = $v;
}
else
{
$h /= 60; // sector 0 to 5
$i = floor($h);
$f = $h - $i; // factorial part of h
$p = $v * ( 1 - $s );
$q = $v * ( 1 - $s * $f );
$t = $v * ( 1 - $s * ( 1 - $f ) );
switch($i) {
case 0:
$r = $v;
$g = $t;
$b = $p;
break;
case 1:
$r = $q;
$g = $v;
$b = $p;
break;
case 2:
$r = $p;
$g = $v;
$b = $t;
break;
case 3:
$r = $p;
$g = $q;
$b = $v;
break;
case 4:
$r = $t;
$g = $p;
$b = $v;
break;
default: // case 5:
$r = $v;
$g = $p;
$b = $q;
break;
}
}
//for rgb=[0,1]
//return array($r,$g,$b);
//for rgb=[0,255]
//return array($r*255,$g*255,$b*255);
//we might want some sort of rounding, so
return array(round($r*255),round($g*255),round($b*255));
}