How to compress images in CodeIgniter, yet do not change their dimensions?

Fer picture Fer · Jan 1, 2010 · Viewed 11.3k times · Source

I have a site where users can upload images. I process these images directly and resize them into 5 additional formats using the CodeIgniter Image Manipulation class. I do this quite efficiently as follow:

  • I always resize from the previous format, instead of from the original
  • I resize using an image quality of 90% which about halves the file size of jpegs

The above way of doing things I implemented after advise I got from another question I asked. My test case is a 1.6MB JPEG in RGB mode with a high resolution of 3872 x 2592. For that image, which is kind of borderline case, the resize process in total takes about 2 secs, which is acceptable to me.

Now, only one challenge remains. I want the original file to be compressed using that 90% quality but without resizing it. The idea being that that file too will take half the file size. I figured I could simply resize it to its' current dimensions, but that doesn't seem to do anything to the file or its size. Here's my code, somewhat simplified:

$sourceimage = "test.jpg";
$resize_settings['image_library'] = 'gd2';
$resize_settings['source_image'] = $sourceimage;
$resize_settings['maintain_ratio'] = false;
$resize_settings['quality'] = '90%';
$this->load->library('image_lib', $resize_settings);

$resize_settings['width'] = $imagefile['width'];
$resize_settings['height'] = $imagefile['height'];
$resize_settings['new_image'] = $filename;
$this->image_lib->initialize($resize_settings);
$this->image_lib->resize();

The above code works fine for all formats except the original. I tried debugging into the CI class to see why nothing happens and I noticed that the script detects that the dimensions did not change. Next, it simply makes a copy of that file without processing it at all. I commented that piece of code to force it to resize but now still nothing happens.

Does anybody know how to compress an image (any image, not just jpegs) to 90% using the CI class without changing the dimensions?

Answer

Alix Axel picture Alix Axel · Jan 1, 2010

I guess you could do something like this:

$original_size = getimagesize('/path/to/original.jpg');

And then set the following options like this:

$resize_settings['width'] = $original_size[0];
$resize_settings['height'] = $original_size[1];

Ok, so that doesn't work due to CI trying to be smart, the way I see it you've three possible options:

  • Rotate the Image by 360º
  • Watermark the Image (with a 1x1 Transparent Image)
  • Do It Yourself

The DIY approach is really simple, I know you don't want to use "custom" functions but take a look:

ImageJPEG(ImageCreateFromString(file_get_contents('/path/to/original.jpg')), '/where/to/save/optimized.jpg', 90);

As you can see, it's even more simpler than using CI.


PS: The snippet above can open any type of image (GIF, PNG and JPEG) and it always saves the image as JPEG with 90% of quality, I believe this is what you're trying to archive.