use strict; use warnings; use feature 'say'; use Imager; use Convert::Color; use Convert::Color::RGB8; my @colors = map tr/#//dr, split "\n", <<'END_OF_COLORS'; #000000 #716373 #704A2B #AF7E45 #963049 #AA2261 #B24551 #E6212E #FF0000 #001200 #FFDE72 #F55B73 END_OF_COLORS my $HEIGHT = 50; my $TILE_W = 50; my $WIDTH = $TILE_W * @colors; my $START = '000000'; my $c = Convert::Color::RGB8-> new( $START ) # -> convert_to( 'hsv' ); # 1 my @data = map [ $_, Convert::Color::RGB8-> new( $_ )-> convert_to( 'hsv' ), # 2 0 ], @colors; my @sorted; my $len = 0; while ( @data ) { $_-> [ 2 ] = $_-> [ 1 ]-> dst_hsv( $c ) # 3 for @data; @data = sort { $a-> [ 2 ] <=> $b-> [ 2 ] } @data; $len += $data[ 0 ][ 2 ]; ( my $str, $c ) = @{ shift @data }; push @sorted, $str; } say $len; my $im = Imager-> new( xsize => $WIDTH, ysize => $HEIGHT, model => 'rgb' ); my $x = 0; for ( @sorted ) { $im-> box( filled => 1, xmin => $x, color => $_ ); $x += $TILE_W } $im-> write( file => 'result.png' ); __END__ use PDL; use PDL::Transform::Color; use PDL::Graphics::ColorDistance; my $c = t_lab-> apply((!t_srgb)-> apply( # pdl [ Convert::Color::RGB8-> new( $START )-> rgb8 ])); # 1 t_lab-> apply((!t_srgb)-> apply( # pdl [ Convert::Color::RGB8-> new( $_ )-> rgb8 ])), # 2 $_-> [ 2 ] = delta_e_2000( $_-> [ 1 ], $c ) # 3