Optimize Images

X @urre
This is a post written originally back in 2019, things may still work but some tools may be out of date

We recently made some optimizations in our resources library. There were a lot of unoptimized images, adding extra weight. After a while this piles up and adds upp to quite a few megabytes of images files. In addition to optimizations, it is important to carefully choose which format to use. Use SVG for vector based graphics, and JPG for (nearly) everything else. The use of a CDN is of course also very good to speed up delivery in different regions.

This is a quick post about some tools and commands for optimizing images.

File and folder sizes

Some commands to quickly locate and collect info about image sizes.

Find all svg images in the current folder

find . -type f | grep '.svg'

Get total size of all .svg images in the current folder

find . -type f -name '*.svg' -exec du -ch {} + | grep total$
1,7M    total

If you want to check the size of a folder:

du -sh  images/
(6.3 M)

Optimize SVG images

I’m using SVG Optimizer, a Nodej.s-based tool for optimizing SVG vector graphics files.

Install SVGO

npm install -g svgo
svgo *.svg

Output:

logo.svg:
Done in 28 ms!
17.751 KiB - 40.4% = 10.58 KiB

illustration.svg:
Done in 42 ms!
17.136 KiB - 5.6% = 16.168 KiB

badge.svg:
Done in 36 ms!
38.621 KiB - 56.8% = 16.702 KiB

Optimize jpg images

Install imageoptim-cli

npm i -g imageoptim-cli

I’m using imageoptim together with jpgmini (jpgmini or jpgmini light has to be installed)

imageoptim --jpegmini --quality 50-75 '**/*.jpg'

Output:

✓ house.jpg was: 9.78kB now: 7.46kB saving: 2.32kB (23.73%)
✓ cat.jpg was: 437kB now: 397kB saving: 40kB (9.16%)
...
✓ TOTAL was: 12.97MB now: 5.83MB saving: 7.14MB (44.94%)
✓ Finished

Optimize png images

Image Optim automates ImageOptim, ImageAlpha, and JPEGmini for Mac to make batch optimisation of images part of your automated build process.

Install imageoptim-cli

npm i -g imageoptim-cli

Optimize png images in our current folder

imageoptim --imagealpha '**/*.png'

Output:

->  imageoptim --imagealpha 'diamonds.png'
i Running ImageAlpha...
i Running ImageOptim...
✓ diamonds.png was: 45.2kB now: 19.9kB saving: 25.3kB (55.94%)
✓ TOTAL was: 45.2kB now: 19.9kB saving: 25.3kB (55.94%)
✓ Finished

Resize

If you have large png images that need to be resized to a smaller size or ratio, we can batch resize them.

Use Mogrify from ImageMagick to resize all png images in the current folder (and subfolders) to 1280px. This also preserves the aspect ratio.

find . -name '*.png' -execdir mogrify -format png -resize 1280\> {} \;

WebP

WebP?

WebP is a modern image format developed by Google, that provides superior lossless and lossy compression for images on the web. Using WebP, webmasters and web developers can create smaller, richer images that make the web faster.

Let’s use the official cwebp encoder.

brew install webp
cwebp -q 75 diamonds.png -o output.webp

This command takes a PNG and outputs it to lossy WebP by way of the -o parameter. By default, the encoder outputs lossy WebP images, and the quality of the output can be set from 0 to 100 via the -q parameter. The default lossy quality setting is 75.

Output:

Saving file 'output.webp'
File:      diamonds.png
Dimension: 1200 x 1200
Output:    4520 bytes Y-U-V-All-PSNR 55.80 99.00 99.00   57.57 dB
           (0.03 bpp)
block count:  intra4:        461  (8.20%)
              intra16:      5164  (91.80%)
              skipped:      4450  (79.11%)
bytes used:  header:             57  (1.3%)
             mode-partition:   2806  (62.1%)
 Residuals bytes  |segment 1|segment 2|segment 3|segment 4|  total
    macroblocks:  |       0%|       0%|       0%|      100%|    5625
      quantizer:  |      36 |      36 |      33 |      26 |
   filter level:  |      11 |       8 |       6 |       4 |

We can also use alpha transparency using the -alpha_q option:

cwebp -q 75 -alpha_q 10 source.png -o output.webp

Update 8 May 2024

These are more great tools you should check out:

Happy optimizations!