| line | stmt | bran | cond | sub | pod | time | code | 
| 1 |  |  |  |  |  |  | package Image::GD::Thumbnail; | 
| 2 |  |  |  |  |  |  |  | 
| 3 |  |  |  |  |  |  | our $VERSION = '0.041'; | 
| 4 | 1 |  |  | 1 |  | 11371 | use Carp; | 
|  | 1 |  |  |  |  | 3 |  | 
|  | 1 |  |  |  |  | 84 |  | 
| 5 | 1 |  |  | 1 |  | 6 | use strict; | 
|  | 1 |  |  |  |  | 2 |  | 
|  | 1 |  |  |  |  | 38 |  | 
| 6 | 1 |  |  | 1 |  | 6 | use warnings; | 
|  | 1 |  |  |  |  | 8 |  | 
|  | 1 |  |  |  |  | 349 |  | 
| 7 |  |  |  |  |  |  |  | 
| 8 |  |  |  |  |  |  | =head1 NAME | 
| 9 |  |  |  |  |  |  |  | 
| 10 |  |  |  |  |  |  | Image::GD::Thumbnail - produce thumbnail images with GD | 
| 11 |  |  |  |  |  |  |  | 
| 12 |  |  |  |  |  |  | =head1 SYNOPSIS | 
| 13 |  |  |  |  |  |  |  | 
| 14 |  |  |  |  |  |  | use GD; | 
| 15 |  |  |  |  |  |  | use Image::GD::Thumbnail; | 
| 16 |  |  |  |  |  |  |  | 
| 17 |  |  |  |  |  |  | # Load your source image | 
| 18 |  |  |  |  |  |  | open IN, 'E:/Images/test.jpg'  or die "Could not open."; | 
| 19 |  |  |  |  |  |  | my $srcImage = GD::Image->newFromJpeg(*IN); | 
| 20 |  |  |  |  |  |  | close IN; | 
| 21 |  |  |  |  |  |  |  | 
| 22 |  |  |  |  |  |  | # Create the thumbnail from it, where the biggest side is 50 px | 
| 23 |  |  |  |  |  |  | my ($thumb,$x,$y) = Image::GD::Thumbnail::create($srcImage,50); | 
| 24 |  |  |  |  |  |  |  | 
| 25 |  |  |  |  |  |  |  | 
| 26 |  |  |  |  |  |  | # Save your thumbnail | 
| 27 |  |  |  |  |  |  | open OUT, ">E:/Images/thumb_test.jpg" or die "Could not save "; | 
| 28 |  |  |  |  |  |  | binmode OUT; | 
| 29 |  |  |  |  |  |  | print OUT $thumb->jpeg; | 
| 30 |  |  |  |  |  |  | close OUT; | 
| 31 |  |  |  |  |  |  |  | 
| 32 |  |  |  |  |  |  | __END__ | 
| 33 |  |  |  |  |  |  |  | 
| 34 |  |  |  |  |  |  | =head1 DESCRIPTION | 
| 35 |  |  |  |  |  |  |  | 
| 36 |  |  |  |  |  |  | This module uses the GD library to create a thumbnail image with no side bigger than you specify. | 
| 37 |  |  |  |  |  |  |  | 
| 38 |  |  |  |  |  |  | The subroutine C takes two arguments: the first is a GD image object, | 
| 39 |  |  |  |  |  |  | the second is the size, in pixels, you wish the image's longest side to be. | 
| 40 |  |  |  |  |  |  | It returns a new GD image object (the thumbnail), as well as the I and I | 
| 41 |  |  |  |  |  |  | dimensions, as (integer) scalars. | 
| 42 |  |  |  |  |  |  |  | 
| 43 |  |  |  |  |  |  | =head1 PREREQUISITES | 
| 44 |  |  |  |  |  |  |  | 
| 45 |  |  |  |  |  |  | GD | 
| 46 |  |  |  |  |  |  |  | 
| 47 |  |  |  |  |  |  | =cut | 
| 48 |  |  |  |  |  |  |  | 
| 49 | 0 |  |  | 0 | 0 |  | sub create { my ($orig,$max) = (shift,shift); | 
| 50 | 0 | 0 |  |  |  |  | confess "No image supplied" unless $orig; | 
| 51 | 0 | 0 |  |  |  |  | confess "No scale factor or geometry" unless $max; | 
| 52 |  |  |  |  |  |  |  | 
| 53 | 0 |  |  |  |  |  | my ($ox,$oy) = $orig->getBounds(); | 
| 54 | 0 |  |  |  |  |  | my ($maxx, $maxy); | 
| 55 | 0 | 0 |  |  |  |  | if (($maxx, $maxy) = $max =~ /^(\d+)x(\d+)$/i){ | 
| 56 | 0 | 0 |  |  |  |  | $max = ($ox>$oy)? $maxx : $maxy; | 
| 57 |  |  |  |  |  |  | } else { | 
| 58 | 0 |  |  |  |  |  | $maxx = $maxy = $max; | 
| 59 |  |  |  |  |  |  | } | 
| 60 |  |  |  |  |  |  |  | 
| 61 |  |  |  |  |  |  | # my $r = ($ox>$oy) ? ($ox/$maxx) : ($oy/$maxy); | 
| 62 | 0 | 0 |  |  |  |  | my $r = ($ox/$maxx) > ($oy/$maxy) ? ($ox/$maxx) : ($oy/$maxy); | 
| 63 |  |  |  |  |  |  |  | 
| 64 | 0 |  |  |  |  |  | my $thumb = GD::Image->new($ox/$r,$oy/$r); | 
| 65 | 0 |  |  |  |  |  | $thumb->copyResized($orig,0,0,0,0,$ox/$r,$oy/$r,$ox,$oy); | 
| 66 | 0 |  |  |  |  |  | return $thumb, sprintf("%.0f",$ox/$r), sprintf("%.0f",$oy/$r); | 
| 67 |  |  |  |  |  |  | } | 
| 68 |  |  |  |  |  |  |  | 
| 69 |  |  |  |  |  |  | 1; | 
| 70 |  |  |  |  |  |  |  | 
| 71 |  |  |  |  |  |  | __END__ |