sub rgb_to_hsv { my ($r, $g, $b) = shift @_; my $max = 0; my $min = 255; for ($r, $g, $b) { $max = $_ if $max < $_ } for ($r, $g, $b) { $min = $_ if $min > $_ } my ($h, $s, $v); #H if ($max == $min) { $h = undef; } elsif (($max == $r) && ($g >= $b)) { $h = 60 * (($g-$b)/($max-$min)) + 0; } elsif (($max== $r) && ($g < $b)) { $h = 60 * (($g-$b)/($max-$min)) + 360; } elsif ($max == $g) { $h = 60 * (($b-$r)/($max-$min)) + 120; } elsif ($max == $b) { $h = 60 * (($r-$g)/($max-$min)) + 240; } #S if ($max == 0) { $s = 0; } else { $s = 1 - ($min / $max) } #V $v = $max; return ($h, $s, $v); }