PHP Thumbnail Image script, quality looking funny on thumbnail.

Discussion in 'PHP' started by darksat, Jan 28, 2008.

  1. #1
    Im having a problem with this script, the quality of the thumbnails looks very grainy.
    I tried adding truecolour but it makes no difference.
    Any help would be appreciated.
    Regards Mike

          <?php
      error_reporting(0);
    
    $val = $_GET['sid'];
    	  mkdir("images/storyimg/$val/", 0777);
          $idir = "images/storyimg/$val";   // Path To Images Directory
          $tdir = "images/storyimg/$val/$val";   // Path To Thumbnails Directory
          $twidth = "180";   // Maximum Width For Thumbnail Images
          $theight = "180";   // Maximum Height For Thumbnail Images
          if (!isset($_GET['subpage'])) {   // Image Upload Form Below   ?>
            <form method="post" action="addphoto.php?subpage=upload" enctype="multipart/form-data">
             File:<br />
            <input type="file" name="imagefile" class="form">
            <br /><br />
            <input name="submit" type="submit" value="Sumbit" class="form">  <input type="reset" value="Clear" class="form">
            </form>
          <? } else  if (isset($_GET['subpage']) && $_GET['subpage'] == 'upload') {   // Uploading/Resizing Script
    	  
            $url = $_FILES['imagefile']['name'];   // Set $url To Equal The Filename For Later Use
            if ($_FILES['imagefile']['type'] == "image/jpg" || $_FILES['imagefile']['type'] == "image/jpeg" || $_FILES['imagefile']['type'] == "image/pjpeg") {
              $file_ext = strrchr($_FILES['imagefile']['name'], '.'); 
    	
    		  // Get The File Extention In The Format Of , For Instance, .jpg, .gif or .php
              $copy = copy($_FILES['imagefile']['tmp_name'], "$idir" . $_FILES['imagefile']['name']);   // Move Image From Temporary Location To Permanent Location
              if ($copy) {   // If The Script Was Able To Copy The Image To It's Permanent Location
                print 'Image uploaded successfully.<br /><a href="javascript: history.go(-1)">Go Back</a>';   // Was Able To Successfully Upload Image
                $simg = imagecreatefromjpeg("$idir" . $url);   // Make A New Temporary Image To Create The Thumbanil From
                $currwidth = imagesx($simg);   // Current Image Width
                $currheight = imagesy($simg);   // Current Image Height
                if ($currheight > $currwidth) {   // If Height Is Greater Than Width
                   $zoom = $twidth / $currheight;   // Length Ratio For Width
                   $newheight = $theight;   // Height Is Equal To Max Height
                   $newwidth = $currwidth * $zoom;   // Creates The New Width
                } else {    // Otherwise, Assume Width Is Greater Than Height (Will Produce Same Result If Width Is Equal To Height)
                  $zoom = $twidth / $currwidth;   // Length Ratio For Height
                  $newwidth = $twidth;   // Width Is Equal To Max Width
                  $newheight = $currheight * $zoom;   // Creates The New Height
                }
                $dimg = imagecreate($newwidth, $newheight);   // Make New Image For Thumbnail
                imagetruecolortopalette($simg, true, 16777216);   // Create New Color Pallete
                $palsize = ImageColorsTotal($simg);
                for ($i = 0; $i < $palsize; $i++) {   // Counting Colors In The Image
                 $colors = ImageColorsForIndex($simg, $i);   // Number Of Colors Used
                 ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']);   // Tell The Server What Colors This Image Will Use
                }
                imagecopyresized($dimg, $simg, 0, 0, 0, 0, $newwidth, $newheight, $currwidth, $currheight);   // Copy Resized Image To The New Image (So We Can Save It)
                imagejpeg($dimg, "$tdir" . $url);   // Saving The Image
                imagedestroy($simg);   // Destroying The Temporary Image
                imagedestroy($dimg);   // Destroying The Other Temporary Image
                print 'Image thumbnail created successfully.';   // Resize successful
              } else {
                print '<font color="#FF0000">ERROR: Unable to upload image.</font>';   // Error Message If Upload Failed
              }
            } else {
              print '<font color="#FF0000">ERROR: Wrong filetype (has to be a .jpg or .jpeg. Yours is ';   // Error Message If Filetype Is Wrong
              print $file_ext;   // Show The Invalid File's Extention
              print '.</font>';
            }
    
          } ?>
    PHP:

     
    darksat, Jan 28, 2008 IP
  2. Dan3

    Dan3 Peon

    Messages:
    43
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #2
    Hi Darksat,

    why try to reinvent the wheel? You can achieve the same with much less code and PEAR, just to let you know.

    HTTP_Upload

    Image_Transform:

    <?php
    require_once 'Image/Transform.php';
    $i =& Image_Transform::factory('');
    
    $i->load('test.jpg');
    $i->fit(100,100);
    $i->save('resized.png', 'png');
    ?>
    PHP:
    Hope it helps.
     
    Dan3, Jan 28, 2008 IP
  3. darksat

    darksat Guest

    Messages:
    1,239
    Likes Received:
    16
    Best Answers:
    0
    Trophy Points:
    0
    #3
    I kind of need to get the existing code working if I can.
     
    darksat, Jan 28, 2008 IP
  4. darksat

    darksat Guest

    Messages:
    1,239
    Likes Received:
    16
    Best Answers:
    0
    Trophy Points:
    0
    #4
    Bump.
    Im sure its something fairly simple but the existing code works fine appart from the image pixelation.
     
    darksat, Jan 29, 2008 IP
  5. HoagieKat

    HoagieKat Peon

    Messages:
    87
    Likes Received:
    3
    Best Answers:
    0
    Trophy Points:
    0
    #5
    I think what's happening is you're loading a JPEG and then converting it to a palette based image, then still outputting it as JPEG...

    
                $dimg = imagecreate($newwidth, $newheight);   // Make New Image For Thumbnail
                imagetruecolortopalette($simg, true, 16777216);   // Create New Color Pallete
                $palsize = ImageColorsTotal($simg);
                for ($i = 0; $i < $palsize; $i++) {   // Counting Colors In The Image
                 $colors = ImageColorsForIndex($simg, $i);   // Number Of Colors Used
                 ImageColorAllocate($dimg, $colors['red'], $colors['green'], $colors['blue']);   // Tell The Server What Colors This Image Will Use
                }
    
    PHP:
    to
    
                $dimg = imagecreatetruecolor($newwidth, $newheight);   // Make New Image For Thumbnail
    
    PHP:
    should fix it. Also try imagecopyresampled instead of imagecopyresized
     
    HoagieKat, Jan 29, 2008 IP
  6. raleagh

    raleagh Peon

    Messages:
    2
    Likes Received:
    0
    Best Answers:
    0
    Trophy Points:
    0
    #6
    should be

    $zoom = $theight / $currheight; // Length Ratio For Width

    otherwise your reduced pictures will be out of proportion
     
    raleagh, Apr 3, 2008 IP