#! perl -slw use strict; use Data::Dump qw[ pp ]; use List::Util qw[ max min ]; use GD; sub rgb2n{ unpack 'N', pack 'CCCC', 0, @_ } sub rgb2hsv { my( $r, $g, $b ) = map $_ / 255, @_; my $max = max( $r, $g, $b ); my $min = min( $r, $g, $b ); my $delta = $max - $min; my( $h, $s, $v ) = ( 0, 0, $max ); $s = $max == 0 ? 0 : $delta / $max; if( $max == $min){ $h = 0; }else{ if( $r == $max ) { $h = ( $g - $b ) / $delta + ( $g < $b ? 6 : 0 ); } elsif( $g == $max ) { $h = ( $b - $r ) / $delta + 2; } else { $h = ( $r - $g ) / $delta + 4; } $h /= 6; } return $h, $s, $v; } my $im = GD::Image->newFromJpeg( $ARGV[ 0 ], 1 ); my $im2 = GD::Image->new( 30*256, 256, 1 ); $im2->fill( 0, 0, rgb2n( 0, 255, 255 ) ); my( $i, %index ) = 0; for my $y ( 0 .. $im->height ) { for my $x ( 0 .. $im->width ) { my( $r, $g, $b ) = $im->rgb( $im->getPixel( $x, $y ) ); my( $h, $s ,$v ) = rgb2hsv( $r, $g, $b ); next if $h < 0.083333333333333333333333333333333 or $h > 0.16666666666666666666666666666666; print "rgb($r,$g,$b) hsv($h,$s,$v)"; $im2->setPixel( int(($h-0.083333333333333333333333333333333)*360)*256+($s*256), $v*256, rgb2n( $r, $g, $b ) ); } } open O, '>:raw', 'golds.png' or die $!; print O $im2->png; close O; system 'golds.png';