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

11,394

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.

Share:
11,394
Bilal Ali Akbar
Author by

Bilal Ali Akbar

Updated on June 04, 2022

Comments

  • Bilal Ali Akbar
    Bilal Ali Akbar almost 2 years

    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?