Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP: How to compress images without losing visible quality (automatically)?

I'm wondering how to figure out the best compress rate (small filesize + no quality loss) automatically.

At the moment I'm using imagejpeg() with $quality = 85 for each .jpg.

PageSpeed (Chrome Plugin) suggests, to lower the quality of a few images to save some kb. The percentage of reduction is different.

I'd like to write a cronjob that crawls a specific directory and optimizes every image.

How does PageSpeed or TinyPNG figure out the best optimized quality and is this possible with PHP or another serverside-language?

like image 950
Mr. B. Avatar asked Oct 31 '13 00:10

Mr. B.


1 Answers

TinyPNG uses pngquant.

Pngquant has option to set desired quality, similar to JPEG. You can run something like:

<?php system('pngquant --quality=85 image.png'); ?>

Pngquant website has example code showing how to use pngquant from PHP.


For JPEG you can apply lossless jpegcrush.

JpegMini (commercial) and jpeg-archive (free) are lossy and can can automatically find a minimal good quality for a JPEG.

In PHP you can roughly estimate how much JPEG was compressed by observing how much file size changes after re-compression. File size of JPEG recompressed at same or higher quality will not change much (but will lose visual quality).

If you recompress JPEG and see file size halved, then keep the recompressed version. If you see only 10-20% drop in file size, then keep the original.

If you're compressing yourself, use MozJPEG (here's an online version).

like image 62
Kornel Avatar answered Oct 21 '22 08:10

Kornel