[Koha-patches] [PATCH] NOTE: REQUIRES INSTALLATION OF Image::Magick; Adding image scaling/resizing capability to picture-upload.pl
Chris Nighswonger
cnighswonger at foundations.edu
Tue Apr 8 17:04:06 CEST 2008
---
Makefile.PL | 1 +
tools/picture-upload.pl | 62 ++++++++++++++++++++++++++++------------------
2 files changed, 39 insertions(+), 24 deletions(-)
diff --git a/Makefile.PL b/Makefile.PL
index 434ea31..6750d2f 100644
--- a/Makefile.PL
+++ b/Makefile.PL
@@ -537,6 +537,7 @@ WriteMakefile(
'HTML::Template::Pro' => 0.69,
'HTTP::Cookies' => 1.39,
'HTTP::Request::Common' => 1.26,
+'Image::Magick' => 6.2,
'LWP::Simple' => 1.41,
'LWP::UserAgent' => 2.033,
'Lingua::Stem' => 0.82,
diff --git a/tools/picture-upload.pl b/tools/picture-upload.pl
index 9d212ef..f6b7e65 100755
--- a/tools/picture-upload.pl
+++ b/tools/picture-upload.pl
@@ -22,6 +22,7 @@
use File::Temp;
use File::Copy;
use CGI;
+use Image::Magick;
use C4::Context;
use C4::Auth;
use C4::Output;
@@ -198,41 +199,53 @@ return 1;
sub handle_file {
my ($cardnumber, $source, %count) = @_;
warn "Entering sub handle_file; passed \$cardnumber=$cardnumber, \$source=$source" if $DEBUG;
- my $mimemap = {
- "gif" => "image/gif",
- "jpg" => "image/jpeg",
- "jpeg" => "image/jpeg",
- "png" => "image/png"
- };
$count{filenames} = () if !$count{filenames};
$count{source} = $source if !$count{source};
if ($cardnumber && $source) { # Now process any imagefiles
my %filerrors;
+ my $filename;
+ if ($filetype eq 'image') {
+ $filename = $uploadfilename;
+ } else {
+ $filename = $1 if ($source =~ /\/([^\/]+)$/);
+ }
warn "Source: $source" if $DEBUG;
- if (open (IMG, "$source")) {
- #binmode (IMG); # Not sure if we need this or not -fbcit
- my $imgfile;
- while (<IMG>) {
- $imgfile .= $_;
- }
- if ($filetype eq 'image') {
- $filename = $uploadfilename;
- } else {
- $filename = $1 if ($source =~ /\/([^\/]+)$/);
- }
- warn "$filename is " . length($imgfile) . " bytes";
- if (length($imgfile) > 100000) {
+ my $size = (stat($source))[7];
+ if ($size > 100000) { # This check is necessary even with image resizing to avoid possible security/performance issues...
warn "$filename is TOO BIG!!! I refuse to beleagur my database with that much data. Try reducing the pixel dimensions and I\'ll reconsider.";
$filerrors{'OVRSIZ'} = 1;
push my @filerrors, \%filerrors;
- push @{ $count{filenames} }, { filerrors => \@filerrors, source => $filename, cardnumber => $cardnumber };
+ push @{ $count{filenames} }, { filerrors => \@filerrors, source => $filename, cardnumber => $cardnumber };
$template->param( ERRORS => 1 );
- return %count;
+ return %count; # this one is fatal so bail here...
}
- my $mimetype = $mimemap->{lc ($1)} if $filename =~ m/\.([^.]+)$/i;
- warn "$filename is mimetype \"$mimetype\"" if $DEBUG;
- my $dberror = PutPatronImage($cardnumber,$mimetype, $imgfile) if $mimetype;
+ my $image = Image::Magick->new;
+ if (open (IMG, "$source")) {
+ $image->Read(file=>\*IMG);
close (IMG);
+ my $mimetype = $image->Get('mime');
+ # Check the pixel size of the image we are about to import...
+ my ($height, $width) = $image->Get('height', 'width');
+ warn "$filename is $width pix X $height pix." if $DEBUG;
+ if ($width > 140 || $height > 200) { # MAX pixel dims are 140 X 200...
+ warn "$filename exceeds the maximum pixel dimensions of 140 X 200. Resizing...";
+ my $percent_reduce; # Percent we will reduce the image dimensions by...
+ if ($width > 140) {
+ $percent_reduce = sprintf("%.5f",(140/$width)); # If the width is oversize, scale based on width overage...
+ } else {
+ $percent_reduce = sprintf("%.5f",(200/$height)); # otherwise scale based on height overage.
+ }
+ my $width_reduce = sprintf("%.0f", ($width * $percent_reduce));
+ my $height_reduce = sprintf("%.0f", ($height * $percent_reduce));
+ warn "Reducing $filename by " . ($percent_reduce * 100) . "\% or to $width_reduce pix X $height_reduce pix";
+ $image->Resize(width=>$width_reduce, height=>$height_reduce);
+ my @img = $image->ImageToBlob();
+ $imgfile = $img[0];
+ warn "$filename is " . length($imgfile) . " bytes after resizing.";
+ undef $image; # This object can get big...
+ }
+ warn "Image is of mimetype $mimetype" if $DEBUG;
+ my $dberror = PutPatronImage($cardnumber,$mimetype, $imgfile) if $mimetype;
if ( !$dberror && $mimetype ) { # Errors from here on are fatal only to the import of a particular image, so don't bail, just note the error and keep going
$count{count}++;
push @{ $count{filenames} }, { source => $filename, cardnumber => $cardnumber };
@@ -273,5 +286,6 @@ sub handle_file {
Original contributor(s) undocumented
Database storage, single patronimage upload option, and extensive error trapping contributed by Chris Nighswonger cnighswonger <at> foundations <dot> edu
+Image scaling/resizing contributed by the same.
=cut
--
1.5.3.7
More information about the Koha-patches
mailing list