Search code examples
phpimage-resizingimage-compression

Blurry downsizing a 400x400 to 300x300


Ok, here is the issue, the 400x400 jpeg looks fine the quality is great. However when resized to 300x300 it looks like it has been pulled apart and put back together by a 2 year old.

here is the script

$image->resize(300,300);

which calls the following script

 function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }   

picture uploaded for resizing.

enter image description here

Here is the image class

class SimpleImage {

   var $image;
   var $image_type;

   function load($filename) {

      $image_info = getimagesize($filename);
      $this->image_type = $image_info[2];
      if( $this->image_type == IMAGETYPE_JPEG ) {

         $this->image = imagecreatefromjpeg($filename);
      } elseif( $this->image_type == IMAGETYPE_GIF ) {

         $this->image = imagecreatefromgif($filename);
      } elseif( $this->image_type == IMAGETYPE_PNG ) {

         $this->image = imagecreatefrompng($filename);
      }
   }

   function save($filename, $image_type=IMAGETYPE_JPEG, $compression=99, $permissions=null) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image,$filename,$compression);
      } elseif( $image_type == IMAGETYPE_GIF ) {
         imagegif($this->image,$filename);
      } elseif( $image_type == IMAGETYPE_PNG ) {
         imagepng($this->image,$filename);
      }


      if( $permissions != null) {

        chmod($filename,$permissions);
      }
   }
   function output($image_type=IMAGETYPE_JPEG) {

      if( $image_type == IMAGETYPE_JPEG ) {
         imagejpeg($this->image);
      } elseif( $image_type == IMAGETYPE_GIF ) {

         imagegif($this->image);
      } elseif( $image_type == IMAGETYPE_PNG ) {

         imagepng($this->image);
      }
   }

    function getWidth() {

      return imagesx($this->image);
   }
   function getHeight() {

      return imagesy($this->image);
   }
   function resizeToHeight($height) {

      $ratio = $height / $this->getHeight();
      $width = $this->getWidth() * $ratio;
      $this->resize($width,$height);
   }

  function resize($width,$height) {
      $new_image = imagecreatetruecolor($width, $height);
      imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
      $this->image = $new_image;
   }   

}

Solution

  • To test your function I had to implement the rest of the class. This works for me on PHP 5.5.14. Your code is included here unaltered:

    class image
    {
        public $image = null;
    
        public function __construct($img)
        {
            $this->image = imagecreatefromjpeg($img);
        }
    
        public function resize($width,$height) {
            $new_image = imagecreatetruecolor($width, $height);
            imagecopyresampled($new_image, $this->image, 0, 0, 0, 0, $width, $height, $this->getWidth(), $this->getHeight());
            $this->image = $new_image;
        }
    
        public function getWidth()
        {
            return imagesx($this->image);
        }
    
        public function getHeight()
        {
            return imagesy($this->image);
        }
    }
    
    $image = new image('img.jpg');
    
    $image->resize(300,300);
    
    header('Content-Type: image/jpeg');
    imagejpeg($image->image);
    exit;
    

    This gives me the following output, which is a little blurry, but much better than your example.

    enter image description here