The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;
use Image::Epeg qw(:constants);
use Benchmark ':all';
use GD;
use Imager;
use Image::Magick;

print "# Image::Epeg   $Image::Epeg::VERSION\n";
print "# Imager        $Imager::VERSION\n";
print "# GD            $GD::VERSION\n";
print "# Image::Magick $Image::Magick::VERSION\n";

my $srcfile = shift or die "Usage: $0 fname";
my $src = Image::Epeg->new($srcfile);
print "# origsize: @{[ $src->get_width ]} x @{[ $src->height ]}\n";
my $width = int($src->get_width * 0.4);
my $height = int($src->get_height * 0.4);
print "# size: $width x $height\n";

timethese(
    1 => {
        epeg => sub {
            my $epeg = Image::Epeg->new( $srcfile );
            $epeg->resize( $width, $height, MAINTAIN_ASPECT_RATIO );
            $epeg->write_file( "epeg.jpg" );
        },
        (
            map { 
                my $qtype = $_;
                "Imager-$_" => sub {
                    my $img = Imager->new;
                    $img->read(file => $srcfile) or die;
                    my $scaled = $img->scale(xpixels => $width, ypixels => $height, qtype => $qtype) or die;
                    $scaled->write(file => "imager-$qtype.jpg", type => 'jpeg') or die;
                }
            }
            qw/ normal mixing preview /
        ),
        (
            map {
                my $method = $_;
                "GD-$_" => sub {
                    my $gd = GD::Image->new($srcfile) or die;
                    my $scaled = GD::Image->new( $width, $height );
                    $scaled->$method( $gd, 0, 0, 0, 0, $width, $height,
                        $gd->width, $gd->height );

                    open my $fh, '>', "gd-$method.jpg";
                    print $fh $scaled->jpeg;
                    close $fh;
                };
            }
            qw/copyResized copyResampled/
        ),
        imagemagick => sub {
            my $img = Image::Magick->new;
            $img->Read($srcfile);
            $img->Resize(
                width  => $width,
                height => $height,
            );
            $img->Write('imagemagick.jpg');
        },
        "imagemagick-lanczos" => sub {
            my $img = Image::Magick->new;
            $img->Read($srcfile);
            $img->Resize(
                width  => $width,
                height => $height,
                filter => 'Lanczos',
            );
            $img->Write('imagemagick-lanczos.jpg');
        }
    }
);