Compressing an image in php

I am compressing an image using the following class.

<?php
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;
}      

}

?>

      

And my PHP code looks like.

include_once(ROOT.'/library/SimpleImage.php')
$image = new SimpleImage();
$image->load($image_name);
$image->resizeToWidth(100);
$image->save($image_name);

      

Now the problem is that my images are compressed but their original color combination is lost ... Not sure what to do .. ??

Please suggest another class for image compression.

+3


source to share


2 answers


This is a function I coded a long time ago, it is not very optimized but should do the trick. Works for various mime types and allows you to save the modified image to a new location. You can easily simplify it if you need fewer features.



public function resizePicture($path, $new_path, $new_width, $new_height, $proportion = false) {
    $size = getimagesize($path);
    $x = 0;
    $y = 0;

    switch($size['mime']) {
        case 'image/jpeg':
            $picture = imagecreatefromjpeg($path);
        break;
        case 'image/png':
            $picture = imagecreatefrompng($path);
        break;
        case 'image/gif':
            $picture = imagecreatefromgif($path);
        break;
        default:
            return false;
        break;
    }

    $width = $size[0];
    $height = $size[1];

    $frame = imagecreatetruecolor($new_width, $new_height);
    if($size['mime'] == 'image/jpeg') {
        $bg = imagecolorallocate($frame, 255, 255, 255);
        imagefill($frame, 0, 0, $bg);
    } else if($size['mime'] == 'image/gif' or $size['mime'] == 'image/png') {
        imagealphablending($picture, false);
        imagesavealpha($picture, true);
        imagealphablending($frame, false);
        imagesavealpha($frame, true);
    }

    if($width < $new_width and $height < $new_height) {
        $x = ($new_width - $width) / 2;
        $y = ($new_height - $height) / 2;
        imagecopy($frame, $picture, $x, $y, 0, 0, $width, $height);
    } else {
        if($proportion and $width != $height) {
            if($width > $height) {
                $old_height = $new_height;
                $new_height = $height * $new_width / $width;
                $y = abs($old_height - $new_height) / 2;
            } else {
                $old_width = $new_width;
                $new_width = $width * $new_height / $height;
                $x = abs($old_width - $new_width) / 2;
            }
        }
        imagecopyresampled($frame, $picture, $x, $y, 0, 0, $new_width, $new_height, $width, $height);
    }

    switch($size['mime']) {
        case 'image/jpeg':
            imagejpeg($frame, $new_path, 85);
        break;
        case 'image/png':
            imagepng($frame, $new_path, 8);
        break;
        case 'image/gif':
            imagegif($frame, $new_path);
        break;
        default:
            return false;
        break;
    }
}

      

+3


source


I am using SimpleImage.php and find it useful as a small script, but I had to change the $ 100 compression value to a save function.



Perhaps compression of some formats reduces the number of colors, but by setting $ compression to 100, you will tell the script "Don't compress!" After that, the images look as they are supposed to.

0


source







All Articles