use strict; use warnings; # unused ... use feature 'say'; # unnecessary? ... use open IO => ':raw'; use GD; use Convert::Color; # Handy.. Didn't know of this module my $saturation_factor = 0.9; # Will ultimately be coming from elsewhere # ---- sub desaturate { local $" = ','; my @HSV = Convert::Color-> new( "rgb8:@_" )-> as_hsv-> hsv; $HSV[ 1 ] *= $saturation_factor; return Convert::Color-> new( "hsv:@HSV" )-> as_rgb8-> rgb8 } # ---- # this is as clear as mud in a beer bottle to me... # my $gd = GD::Image-> newFromPngData( scalar qx/convert rose: png:-/, 1 ); my $gd = GD::Image->newFromPng("ruddy.png", 1) || die("cant on loading file\n"); # 1 = truecolour # my ($max_X, $max_Y) = $gd->getBounds(); # My version my $max_X = $gd->width; # TMTOWTDI my $max_Y = $gd->height; #for my $y ( 0 .. $gd->height - 1 ) { # Construct causes 'unknown method' errors ()... # for my $x ( 0 .. $gd->width - 1 ) { for my $y ( 0 .. $max_Y - 1 ) { for my $x ( 0 .. $max_X - 1 ) { my $packed_rgb = $gd-> getPixel( $x, $y ); my @RGB = reverse unpack 'C3', pack 'L', $packed_rgb; $packed_rgb = unpack 'L', pack 'C3x', reverse desaturate( @RGB ); $gd-> setPixel( $x, $y, $packed_rgb ) } } open my $fh, '>', 'new.png' or die; binmode $fh; print $fh $gd->png; close $fh;