Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

image compression in php

I am compressing an image using 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 getting compressed, but their original color combination get lost... Don't know what to do..??

Please suggest another class for image compression.

like image 447
Ashwini Agarwal Avatar asked Mar 23 '12 12:03

Ashwini Agarwal


1 Answers

This is a function I coded a long time ago, it's not realy optimized but it should do the trick. Works for various mime types and allows you to save the modified image into a new location. You can easily simplify it if you need less 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;
    }
}
like image 145
Ronan Avatar answered Oct 23 '22 18:10

Ronan