The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

# simple command-line utility for converting between spaces

use Graphics::ColorObject;

use Getopt::Long;

GetOptions (
			"from=s" => \$from,
			"to=s"   => \$to,
			"verbose"  => \$verbose
			);

$from_components = [ @ARGV ];

if (! $from || ! $to || scalar(@{$from_components}) != 3)
{
	print <<EOUSAGE;
Usage: 
  convert-color.pl  --to=HSV --from=RGB 0.0 0.5 0.5
EOUSAGE

exit;
}

if ($from eq 'RGB') { $color = Graphics::ColorObject->new_RGB( $from_components ); }
elsif ($from eq 'XYZ') { $color = Graphics::ColorObject->new_XYZ( $from_components ); }
elsif ($from eq 'xyY') { $color = Graphics::ColorObject->new_xyY( $from_components ); }
elsif ($from eq 'Lab') { $color = Graphics::ColorObject->new_Lab( $from_components ); }
elsif ($from eq 'LCHab') { $color = Graphics::ColorObject->new_LCHab( $from_components ); }
elsif ($from eq 'Luv') { $color = Graphics::ColorObject->new_Luv( $from_components ); }
elsif ($from eq 'LCHuv') { $color = Graphics::ColorObject->new_LCHuv( $from_components ); }
elsif ($from eq 'YCbCr') { $color = Graphics::ColorObject->new_YCbCr( $from_components ); }
elsif ($from eq 'YPbPr') { $color = Graphics::ColorObject->new_YPbPr( $from_components ); }
elsif ($from eq 'HSV') { $color = Graphics::ColorObject->new_HSV( $from_components ); }
elsif ($from eq 'HSL') { $color = Graphics::ColorObject->new_HSL( $from_components ); }
else { print STDERR "no such colorspace: $from\n"; exit; }

if ($to eq 'RGB') { $to_components = $color->as_RGB(); }
elsif ($to eq 'XYZ') { $to_components = $color->as_XYZ(); }
elsif ($to eq 'xyY') { $to_components = $color->as_xyY(); }
elsif ($to eq 'Lab') { $to_components = $color->as_Lab(); }
elsif ($to eq 'LCHab') { $to_components = $color->as_LCHab(); }
elsif ($to eq 'Luv') { $to_components = $color->as_Luv(); }
elsif ($to eq 'LCHuv') { $to_components = $color->as_LCHuv(); }
elsif ($to eq 'YCbCr') { $to_components = $color->as_YCbCr(); }
elsif ($to eq 'YPbPr') { $to_components = $color->as_YPbPr(); }
elsif ($to eq 'HSV') { $to_components = $color->as_HSV(); }
elsif ($to eq 'HSL') { $to_components = $color->as_HSL(); }
else { print STDERR "no such colorspace: $from\n"; exit; }

printf('%s [%6.3f %6.3f %6.3f] is the same as ', $from, @{$from_components});
printf('%s [%6.3f %6.3f %6.3f] '."\n", $to, @{$to_components});