http://www.perlmonks.org?node_id=11110979

Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

I'm trying to use Imager::GIF "a handy module for animated GIF processing" to scale images but get an error when trying to write:

Usage: i_writegif_wiol(IO,hashref, images...) at .../Imager/File/GIF.pm line 84.

The module has no real tests (just one: will it load) so it looks good to the Testers. I can see what it's trying to do and could cargo-cult it into my own code but I can't see what's wrong, can you?

https://metacpan.org/release/Imager-GIF/source/lib/Imager/GIF.pm https://metacpan.org/release/Imager-File-GIF/source/GIF.pm#L84

#!/usr/bin/perl use strict; use warnings; use Imager::GIF; my $gif = shift || die 'need an image'; my $img = Imager::GIF->new; $img->read(file => $gif) or die $img->errstr; $img = $img->scale(scalefactor => 0.5); $img->write(file => join '.', $gif, 'half', 'gif') or die $img->errstr;
Thanks for your attention to this matter.

Replies are listed 'Best First'.
Re: Imager::GIF seems broken
by vr (Curate) on Jan 05, 2020 at 15:15 UTC

    Hi, apart from, contrary to Synopsis even, the write method expecting file name (not options hash), everything else seems to work per POD: the read is to be used as constructor (class method):

    use strict; use warnings; use Imager::GIF; my $gif = shift || die 'need an image'; my $img; $img = Imager::GIF-> read( file => $gif ) or die $img-> errstr; $img = $img-> scale( scalefactor => 0.5 ); $img-> write( join '.', $gif, 'half', 'gif' ) or die $img-> errstr;
      Thank you vr! The module works as expected when following your instructions. Apparently the documentation synopsis contains two severe errors.

      Imager::GIF synopsis:

      my $sonic = Imager::GIF->new(file => 'sonic.gif');
      
      Should be:
      my $sonic = Imager::GIF->read(file => 'sonic.gif');
      
      Imager::GIF synopsis:
      $small_sonic->write(file => 'small_sonic.gif');
      
      Should be:
      $small_sonic->write('small_sonic.gif');
      
      The first problem, not using the read method to construct the object, was causing the write error. The second issue, supplying a hash instead of file name to write method, silently fails to do anything.

      Kudos

Re: Imager::GIF seems broken
by marto (Cardinal) on Jan 05, 2020 at 15:04 UTC

    I can't speak for Imager::GIF, but simply replacing it with Imager in your example works without issue.

    #!/usr/bin/perl use strict; use warnings; use Imager; my $gif = shift || die 'need an image'; my $img = Imager->new; $img->read(file => $gif) or die $img->errstr; $img = $img->scale(scalefactor => 0.5); $img->write(file => join '.', $gif, 'half', 'gif') or die $img->errstr;
      Thanks marto but your example demonstrates why we need Imager::GIF. Using Imager to transform animated GIFs will only save the first frame of the animation. Imager::GIF does the dirty work of taking apart the animation, transforming each image, and putting it back together again.

        I'm glad you found a solution, your previous post would make a good patch.