How to Compress Image Size Without Losing Quality in PHP: A Step-by-Step Guide

Rumman Ansari   Software Engineer   2024-07-23 09:33:34   6116  Share
Subject Syllabus DetailsSubject Details
☰ TContent
☰Fullscreen

PHP provides the ability to compress images without losing the quality of it. Even more, we can resize images in PHP to generate thumbnails and lightweight web images.

PHP provides some default functions to compress images and to resize them. Many popular Core-PHP frameworks and CMS use default function to generate thumbnail and images without losing image quality.

Image Compression in PHP

Here we are going to learn how to compress an image in PHP without losing its quality in just 2 easy steps.

STEP 1: Create an HTML form

First, we have to create a simple HTML form to upload an image file.

<span class="pln">
</span><span class="dec">&lt;!DOCTYPE html&gt;</span><span class="pln">
</span><span class="tag">&lt;html&gt;</span><span class="pln">

</span><span class="tag">&lt;head&gt;</span><span class="pln">
    </span><span class="tag">&lt;title&gt;</span><span class="pln">How to compress an image without losing quality in PHP</span><span class="tag">&lt;/title&gt;</span><span class="pln">
</span><span class="tag">&lt;/head&gt;</span><span class="pln">

</span><span class="tag">&lt;body&gt;</span><span class="pln">
    </span><span class="tag">&lt;form</span><span class="pln"> </span><span class="atn">action</span><span class="pun">=</span><span class="atv">''</span><span class="pln"> </span><span class="atn">method</span><span class="pun">=</span><span class="atv">'POST'</span><span class="pln"> </span><span class="atn">enctype</span><span class="pun">=</span><span class="atv">'multipart/form-data'</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;input</span><span class="pln"> </span><span class="atn">name</span><span class="pun">=</span><span class="atv">"image_file"</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"file"</span><span class="pln"> </span><span class="atn">accept</span><span class="pun">=</span><span class="atv">"image/*"</span><span class="tag">&gt;</span><span class="pln">
        </span><span class="tag">&lt;button</span><span class="pln"> </span><span class="atn">type</span><span class="pun">=</span><span class="atv">"submit"</span><span class="tag">&gt;</span><span class="pln">SUBMIT</span><span class="tag">&lt;/button&gt;</span><span class="pln">
    </span><span class="tag">&lt;/form&gt;</span><span class="pln">
</span><span class="tag">&lt;/body&gt;</span><span class="pln">

</span><span class="tag">&lt;/html&gt;</span><span class="pln">
</span>

Note: enctype=”multipart/form-data” is compulsory for image upload precess via post method in form.

STEP 2: Add below PHP code at the top of PHP file

<span class="pln">
</span><span class="pun">&lt;?</span><span class="pln">php
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$_SERVER</span><span class="pun">[</span><span class="str">'REQUEST_METHOD'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">"POST"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    $file_name </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"image_file"</span><span class="pun">][</span><span class="str">"name"</span><span class="pun">];</span><span class="pln">
    $file_type </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"image_file"</span><span class="pun">][</span><span class="str">"type"</span><span class="pun">];</span><span class="pln">
    $temp_name </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"image_file"</span><span class="pun">][</span><span class="str">"tmp_name"</span><span class="pun">];</span><span class="pln">
    $file_size </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"image_file"</span><span class="pun">][</span><span class="str">"size"</span><span class="pun">];</span><span class="pln">
    $error </span><span class="pun">=</span><span class="pln"> $_FILES</span><span class="pun">[</span><span class="str">"image_file"</span><span class="pun">][</span><span class="str">"error"</span><span class="pun">];</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">$temp_name</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"ERROR: Please browse for file before uploading"</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">exit</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">function</span><span class="pln"> compress_image</span><span class="pun">(</span><span class="pln">$source_url</span><span class="pun">,</span><span class="pln"> $destination_url</span><span class="pun">,</span><span class="pln"> $quality</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        $info </span><span class="pun">=</span><span class="pln"> getimagesize</span><span class="pun">(</span><span class="pln">$source_url</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$info</span><span class="pun">[</span><span class="str">'mime'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'image/jpeg'</span><span class="pun">)</span><span class="pln"> $image </span><span class="pun">=</span><span class="pln"> imagecreatefromjpeg</span><span class="pun">(</span><span class="pln">$source_url</span><span class="pun">);</span><span class="pln">
        elseif </span><span class="pun">(</span><span class="pln">$info</span><span class="pun">[</span><span class="str">'mime'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'image/gif'</span><span class="pun">)</span><span class="pln"> $image </span><span class="pun">=</span><span class="pln"> imagecreatefromgif</span><span class="pun">(</span><span class="pln">$source_url</span><span class="pun">);</span><span class="pln">
        elseif </span><span class="pun">(</span><span class="pln">$info</span><span class="pun">[</span><span class="str">'mime'</span><span class="pun">]</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="str">'image/png'</span><span class="pun">)</span><span class="pln"> $image </span><span class="pun">=</span><span class="pln"> imagecreatefrompng</span><span class="pun">(</span><span class="pln">$source_url</span><span class="pun">);</span><span class="pln">
        imagejpeg</span><span class="pun">(</span><span class="pln">$image</span><span class="pun">,</span><span class="pln"> $destination_url</span><span class="pun">,</span><span class="pln"> $quality</span><span class="pun">);</span><span class="pln">
        echo </span><span class="str">"Image uploaded successfully."</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$error </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo $error</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">$file_type </span><span class="pun">==</span><span class="pln"> </span><span class="str">"image/gif"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$file_type </span><span class="pun">==</span><span class="pln"> </span><span class="str">"image/jpeg"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$file_type </span><span class="pun">==</span><span class="pln"> </span><span class="str">"image/png"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">||</span><span class="pln"> </span><span class="pun">(</span><span class="pln">$file_type </span><span class="pun">==</span><span class="pln"> </span><span class="str">"image/pjpeg"</span><span class="pun">))</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        $filename </span><span class="pun">=</span><span class="pln"> compress_image</span><span class="pun">(</span><span class="pln">$temp_name</span><span class="pun">,</span><span class="pln"> </span><span class="str">"uploads/"</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> $file_name</span><span class="pun">,</span><span class="pln"> </span><span class="lit">80</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">else</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        echo </span><span class="str">"Uploaded image should be jpg or gif or png."</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="pun">?&gt;</span><span class="pln">
</span>

Explanation

In the second step first, we checked for the form request method. For File and Image upload POST method is compulsory.

After that, we defined some variables related to the uploaded file. Like, File Name , File Type , File Size , Temporary Location of Uploaded File , and Error in File Upload Process if any.

Next, we created a compress_image() function to upload and compress the image. In this function, we passed three variables of the uploaded file.

  1. $source_url: It is the temporary location in our case of file upload.
  2. $destination_url: It is the destination path where we want to upload our Image.
  3. $quality: It is the rate of Image quality we want to maintain from 1 to 100. If we want to maintain 100% quality we can simply apply 100 or we can pass 80 if we want to compress and lose the image quality by 20%.

In the compress_image() function we first found for image specifications by using getimagesize() function and checked for its mime type.

From mime type, we checked the image is valid or not and create a related replica of image in PHP according to jpeg, png, gif using imagecreatefromjpeg()imagecreatefrompng() imagecreatefromgif()  respectively and saved it in $image variable.

Finally, we created a jpeg image with the help of a $image variable by using imagejpeg() function.

imagejpeg() function is basically image creator function from raw image data. There are three arguments we passed in imagejpeg() function.

  1. $image: Raw image data we created and stored in $image variable
  2. $destination_url: Destination Folder/Directory path where we want to create a new image
  3. $quality: The rate of image quality we want to maintain

In the end, we checked for error in the upload process and used our compress_image() function to handle compression of the uploaded image.

Note: Change the destination directory according to your config. Here we have set the destination path to uploads/ in our working directory.

Conclusion

In the above article, we learned a complete process of image upload and compression with necessary validations.


No Questions Data Available.
No Program Data.

Stay Ahead of the Curve! Check out these trending topics and sharpen your skills.