I wrote a nice image gallery program that uses Image Magick to resize user-uploaded images and create thumbnails for those images at upload. I've been trying to get an alternate version working using GD.pm instead of ImageMagick for those who cannot get their hosts to install IM. Using GD and all the references I can find, I am still having the same problem. Here's whats happening... I load an image into the script using GD and then use the copyResized or the copyResampled function and write the image into the thumbnail file. The script is writing the file, but the thumbnail file is not quite right. The last 10 rows of pixels (sometimes more, sometimes less) come out blank or default gray, while the rest looks fine. I can't seem to find where anyone else has had this problem and I can't seem to find anything wrong with the code. Any ideas? The image uploads successfully prior to this routine and the paths are passed to it successfully. The main section of this routine is below: ________________________________________________________
use CGI qw(:standard); use CGI::Carp qw(fatalsToBrowser); use GD; sub thumbnail { use File::Copy; $maxThumbSize = "150"; $maxImageSize = "600"; ($imageBase,$crap) = split(/\./,$name); $imageBase =~ s/^\s+//g; $imageBase =~ s/\s+$//g; $imageBase =~ s/\"//g; $imageBase =~ s/-//g; $imageBase =~ s/ //g; $imageURL = $albumFolderURL . "/" . $category . "/" . $album . "/Image +s/" . $name; $imagePath = $imageFolder . $S . $name; $categoryCoverPath = $albumFolderPath . $S . $category . $S . "cover.j +pg"; $albumCoverPath = $albumFolderPath . $S . $category . $S . $album . $S + . "cover.jpg"; if ($name =~ m/gif$/) { &error('GIF files are copyrighted through 2004 +'); } if (($name =~ m/jpg$/i) || ($file =~ m/jpeg$/i)) { $sourceImage = GD::Image->newFromJpeg($imagePath); $retype = "no"; } elsif ($name =~ m/png$/i) { open (PNG,imagePath) || &error('Cannot Open PNG File'); $sourceImage = newFromPng GD::Image(PNG) || &error('Cannot Read Fr +om PNG File'); close PNG; $retype = "yes"; } elsif ($name =~ m/bmp$/i) { $sourceImage = GD::Image->newFromWMP("$imagePath"); $retype = "yes"; } ($uploadWidth,$uploadHeight) = $sourceImage->getBounds(); # Resize Original if too big ############################# if ((($uploadWidth > $maxImageSize) || ($uploadHeight > $maxImageSize) +) || ($retype eq "yes")) { if ($uploadWidth > $uploadHeight) { $scalefactor=$maxImageSize/$up +loadWidth; } else { $scalefactor=$maxImageSize/$uploadHeight; } $fileWidth = int($uploadWidth*$scalefactor); $fileHeight = int($up +loadHeight*$scalefactor); $resizedOriginal = new GD::Image($fileWidth, $fileHeight); $resizedOriginal->copyResampled($sourceImage,0,0,0,0,$fileWidth,$fileH +eight,$uploadWidth,$uploadHeight); $newImagePath = $imageFolder . $S . $imageBase . ".jpg"; unlink("$imagePath"); open(IMAGE, ">$newImagePath") or &error('Cannot Open New File'); if ($opsys eq "dos") { binmode IMAGE; } else { flock(IMAGE, 2); } print IMAGE $resizedOriginal->jpeg(75); close(IMAGE) or &error('Cannot Close New File'); chmod(0644, $newImagePath); } # else tranfer images size to new variables else { $fileWidth=$uploadWidth; $fileHeight=$uploadHeight; $newImagePa +th = $imagePath; } # Create Thumbnail if necessary ############################### if ((($fileWidth gt $maxThumbSize) || ($fileHeight gt $maxThumbSize)) +|| ($retype eq "yes")) { if ($fileWidth gt $fileHeight) { $scalefactor=$maxThumbSize/$fileW +idth; } else { $scalefactor=$maxThumbSize/$fileHeight; } $thumbWidth = int($fileWidth*$scalefactor); $thumbHeight = int($fi +leHeight*$scalefactor); } else { $thumbWidth=$fileWidth; $thumbHeight=$fileHeight; } print "Make Thumbnail, FW = $fileWidth, FH = $fileHeight, TW = $thumbW +idth, TH = $thumbHeight<Br>"; $thumbnailImage = new GD::Image($thumbWidth, $thumbHeight); $thumbnailImage->copyResampled($sourceImage,0,0,0,0,$thumbWidth,$thumb +Height,$fileWidth,$fileHeight); $thumbPath = $thumbFolder . $S . $imageBase . "-" . $fileWidth . "x" . + $fileHeight . ".jpg"; if (-f $thumbPath) { unlink("$thumbPath"); } open(THUMB, ">$thumbPath") or &error('Cannot Open New Thumbnail'); if ($opsys eq "dos") { binmode THUMB; } else { flock(THUMB, 2); } if ((($fileWidth gt $maxThumbSize) || ($fileHeight gt $maxThumbSize)) +|| ($retype eq "yes")) { print THUMB $thumbnailImage->jpeg(75); } else { print THUMB $sourceImage->jpeg(75); } close(THUMB) or &error('Cannot Close New Thumbnail'); chmod(0644, $thumbPath); }

In reply to GD.pm copyResized / copyResampled errors by brianviehland

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.