Search code examples
javascriptphpjqueryhtmlimage-compression

Client-Side v/s Server-Side image compression


I am working on something where users can upload pictures(size of image is not limited). Now I have two options either compressing the image using PHP(Server side) or compressing the image on client's machine using JavaScript and then uploading it to the server. I wanted to ask which approach out of the two would be better to implement? Compression on server might lead to heavy load on the server so I thought of client side compression however if I upload an image of bigger size (lets assume 12MB or so) then browser freezes up for a while due to the script.

There is as such no code just a theoretical question. Currently I am using J-I-C for client side compression

Any other good library for client side image compression? and which approach would be better? Any help would be much appreciated.


Solution

  • As @Xorifelse said, the question might be "too broad", but here are some ideas.

    Cons

    • user input must not be trusted; by doing compression on the client-side, you will have to do some sanity check on the server side anyway
    • image compression (or optimization) involve complex operations, there is less choice in JavaScript than in other languages
    • since the operations are complex, you are putting the stress on your clients; if you don't control their configuration (hardware, browser and vers), a situation you can have almost only in an intranet, you will probably degrade (or fail) the browsing experience of some of your users
    • for all those reasons, client-side bugs are harder to track and fix and can quickly cost you more in development than adding resources to your servers

    Pros

    • you offload some computation from your servers
    • you help people with a small bandwidth but powerful computers and recent browser to upload large images

    Image compression tools

    JPEG only

    BGP

    My suggestion

    • if you need to spare your server, you can make the images optimization in batch, asynchronously at some time of the day when your server is not heavily loaded
    • if you have a lot of input, it can be cheaper to send the optimization to another server (ie: an on-demand virtual-machine at Amazon, DigitalOcean, Linode, etc., so you pay only when you need) than to upgrade your "main" server