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.
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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With