3

I use this class to upload and resize images. The problem is that images have bad quality! I need to upload images without losing quality at all!

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=75, $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 resizeToWidth($width) {
      $ratio = $width / $this->getWidth();
      $height = $this->getheight() * $ratio;
      $this->resize($width,$height);
   }

   function scale($scale) {
      $width = $this->getWidth() * $scale/100;
      $height = $this->getheight() * $scale/100; 
      $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;   
   }      
}

Can anyone please help?

King Julien
  • 10,981
  • 24
  • 94
  • 132
  • The quality problem has been fixed but there is one more problem. When I upload transparent png images, the transparent parts got black. How can be this fixed? – King Julien Oct 27 '10 at 14:43
  • see e.g. here: http://stackoverflow.com/questions/313070/png-transparency-with-php – mercator Oct 27 '10 at 14:57

3 Answers3

7

one thing you can do is when you call to function save,

change quality parameter from 75 to 100 , when you call imagejpeg

quality is optional, and ranges from 0 (worst quality, smaller file) to 100 (best quality, biggest file). The default is the default IJG quality value (about 75).

Haim Evgi
  • 123,187
  • 45
  • 217
  • 223
4

I see a 75 as a default for the $compression parameter. You pass that as the quality parameter for imagejpeg. This is what probably generates the quality loss.

Alin Purcaru
  • 43,655
  • 12
  • 77
  • 90
0

You save function defaults the quality value to 75. So either change it when you call it to 100 or change the default to 100. 100 is the best quality.

Coin_op
  • 10,568
  • 4
  • 35
  • 46