omg, ain't GD so very difficult. I'm looking at Image-Square 0.01_4 testers matrix, what was supposed to be walk in the park is like blood covered battlefield.

Half failures are from gd native output format unsupported, who could expect. I'm sorry. It isn't really a problem, because ".gd" is just 11 bytes header plus raw data:

use strict; use warnings; use feature 'say'; use GD; use Digest::MD5 'md5_hex'; say $^V; say $GD::VERSION; say eval { GD::VERSION_STRING() } || '-'; GD::Image-> trueColor( 1 ); my $fn = 'CoventryCathedral.png'; my $i = GD::Image-> new( $fn ); use constant W => 100; my $j = GD::Image-> new( W, W ); $j-> copyResampled( $i, 0, 0, ( $i-> width - $i-> height ) * .5, 0, W, W, $i-> height, $i-> height ); say eval { md5_hex( $j-> gd )} || '-'; say md5_hex( my_gd( $j )); sub my_gd { # same as gd() for truecolor images my $gd = shift; my ( $w, $h ) = $gd-> getBounds; my $s = ''; for my $y ( 0 .. $h - 1 ) { for my $x ( 0 .. $w - 1 ) { $s .= pack 'L>', $gd-> getPixel( $x, $y ); } } return "\xff\xfe" . ( pack 'S>2', $w, $h ) . "\1\xff\xff\xff\xff" . $s } __END__ v5.38.0 2.78 2.3.2 - c97e63fc792ef75b5ff49c078046321e v5.32.1 2.76 2.2.5 c97e63fc792ef75b5ff49c078046321e c97e63fc792ef75b5ff49c078046321e v5.24.3 2.66 2.1.1 adc191aea66fdf99fd74aaeb20b34e5e adc191aea66fdf99fd74aaeb20b34e5e

Note, one checksum is exactly what "t/02-image.t line 41" was expecting, but the latter is what many (but not all) failures have "got".

It appears that copyResampled (and interpolation in general, see further) is unstable between versions and plagued with bugs. Then, even generating synthetic gradient or whatever, and checking for just couple of pixels (e.g. lower left and upper right points) is NOT reliable way to test anything with GD, let alone calculating checksum over whole re-sampled image.

No CoventryCathedral for tests below, simply a red 8 by 8 square to reduce to smaller squares:

use strict; use warnings; use feature 'say'; use GD; say $^V; say $GD::VERSION; say eval { GD::VERSION_STRING() } || '-'; GD::Image-> trueColor( 1 ); my $i = GD::Image-> new( 8, 8 ); $i-> filledRectangle( 0, 0, 7, 7 ,$i-> colorAllocate( 255, 0, 0 )); for my $w ( 1 .. 7 ) { my $j = GD::Image-> new( $w, $w ); $j-> copyResampled( $i, 0, 0, 0, 0, $w, $w, 8, 8 ); print "\t\t\t$w\n"; for my $y ( 0 .. $w - 1 ) { for my $x ( 0 .. $w - 1 ) { my ( $r ) = $j-> rgb( $j-> getPixel( $x, $y )); printf '%x ', $r; } print "\n"; } } __END__ v5.38.0 2.78 2.3.2 1 ff 2 ff ff ff ff 3 fe fe fe fe fe fe ff fe ff 4 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 5 fe ff ff fe ff ff fe ff ff ff fe fe ff ff ff fe fe ff ff fe ff ff ff fe ff 6 fe ff ff ff ff ff ff ff ff ff ff fe ff ff ff fe ff fe ff ff ff ff ff ff ff fe ff ff ff fe ff fe fe ff fe ff 7 fe ff ff fe fe ff fe ff ff ff ff ff ff fe fe ff ff ff ff ff ff ff ff ff ff ff ff ff fe ff ff ff ff ff ff ff ff ff ff ff ff ff ff fe ff ff ff ff ff v5.24.3 2.66 2.1.1 1 ff 2 ff ff ff ff 3 ff ff ff ff ff ff ff ff ff 4 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 5 fe fe fe fe fe fe fe ff fe fe fe fe ff fe ff ff fe fe ff fe fe fe ff fe ff 6 ff ff ff ff ff ff ff fe ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff fe ff ff ff ff ff ff ff ff ff ff 7 fe fe ff fe ff fe fe fe ff fe ff ff fe ff ff fe ff ff ff fe fe fe ff ff ff fe ff ff ff ff ff fe fe ff fe fe ff ff ff ff ff ff fe ff ff ff fe ff fe

Oh, I thought, but I'm copying red pixels to another (smaller) canvas, filled with default black. Maybe, instead, plain simple resize would preserve pure red colour? Note, plain "resize" was not implemented in old versions anyway.

use strict; use warnings; use feature 'say'; use GD; say $^V; say $GD::VERSION; say eval { GD::VERSION_STRING() } || '-'; GD::Image-> trueColor( 1 ); my $i = GD::Image-> new( 8, 8 ); $i-> filledRectangle( 0, 0, 7, 7 ,$i-> colorAllocate( 255, 0, 0 )); for my $w ( 1 .. 7 ) { my $j = $i-> copyScaleInterpolated( $w, $w ); print "\t\t\t$w\n"; for my $y ( 0 .. $w - 1 ) { for my $x ( 0 .. $w - 1 ) { my ( $r ) = $j-> rgb( $j-> getPixel( $x, $y )); printf '%x ', $r; } print "\n"; } } __END__ v5.38.0 2.78 2.3.2 1 ff 2 ff ff ff ff 3 ff ff ff ff fd fd ff fd fd 4 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 5 ff ff ff ff ff ff fd fd fd fd ff fd fd fd fd ff fd fd fd fd ff fd fd fd fd 6 ff ff ff ff ff ff ff fd fd fd fd fd ff fd fd fd fd fd ff fd fd fd fd fd ff fd fd fd fd fd ff fd fd fd fd fd 7 ff ff ff ff ff ff ff ff fd fd fd fd fd fd ff fd fd fd fd fd fd ff fd fd fd fd fd fd ff fd fd fd ff fd fd ff fd fd fd fd fd fd ff fd fd fd fd fd fd

Wait, but there are a few dozen interpolation methods:

use strict; use warnings; use feature 'say'; use GD; say $^V; say $GD::VERSION; say eval { GD::VERSION_STRING() } || '-'; GD::Image-> trueColor( 1 ); my $i = GD::Image-> new( 8, 8 ); $i-> filledRectangle( 0, 0, 7, 7 ,$i-> colorAllocate( 255, 0, 0 )); my @ok_methods; for my $m ( 1 .. 30 ) { eval { for my $w ( 1 .. 7 ) { $i-> interpolationMethod( $m ); my $j = $i-> copyScaleInterpolated( $w, $w ); for my $y ( 0 .. $w - 1 ) { for my $x ( 0 .. $w - 1 ) { my ( $r ) = $j-> rgb( $j-> getPixel( $x, $y )); die unless 255 == $r; } } } 1; } or next; push @ok_methods, $m; } say 'looks like ok methods are: ', join ' ', @ok_methods; __END__ v5.38.0 2.78 2.3.2 looks like ok methods are: 1 2 6 7 8 9 10 11 12 13 14 15 16 17 18 19 2 +0

I have no idea why 3,4,5 i.e.

GD_BILINEAR_FIXED,
GD_BICUBIC,
GD_BICUBIC_FIXED,

are not ok i.e. don't preserve dumb uniform fill of dumb square canvas. I'd laugh out load if asked will this list stay stable for near future. I have much sympathy for GD, but above was a little bit too much.

use strict; use warnings; use feature 'say'; use Imager; my $i = Imager-> new( xsize => 8, ysize => 8 ); $i-> box( filled => 1, color => Imager::Color-> new( 255, 0, 0 )); for my $w ( 1 .. 7 ) { my $j = $i-> scale( xpixels => $w, # qtype => 'mixing', # qtype => 'preview', ); print "\t\t\t$w\n"; for my $y ( 0 .. $w - 1 ) { for my $x ( 0 .. $w - 1 ) { my ( $r ) = $j-> getpixel( x => $x, y => $y )-> rgba; printf '%x ', $r; } print "\n"; } } __END__ 1 ff 2 ff ff ff ff 3 ff ff ff ff ff ff ff ff ff 4 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 5 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 6 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff 7 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff

In reply to Re^3: Testing image output by Anonymous Monk
in thread Testing image output by Bod

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.