image optimizer for web

1.28

a significant one, which have improvements for all transforms — i rewrote some pingo's features to see if i can make it better and eventually, i made another tool with less limitations

auto

auto would be more efficient — it would be able to choose the auto lossless/lossy more precisely — better & faster detection of sensible area and usage of new filters

auto (neighbor)
version infile outfile time
1.27 431.34 KB 64.57 KB 0.05s
1.28 431.34 KB 33.10 KB 0.02s
1.27 57.51 KB 43.21 KB 0.03s
1.28 57.51 KB 20.19 KB 0.02s
1.27 155.56 KB 144.21 KB 0.03s
1.28 155.56 KB 58.53 KB 0.02s
auto (gradient)
version infile outfile time
1.27 171.02 KB 41.20 KB 0.05s
1.28 171.02 KB 21.43 KB 0.08s
1.27 777.57 KB 84.44 KB 0.16s
1.28 777.57 KB 59.58 KB 0.14s
auto (palette cleaner)
version infile outfile time
1.27 471.77 KB 421.88 KB 0.09s
1.28 471.77 KB 126.81 KB 0.16s
1.27 314.14 KB 281.74 KB 0.08s
1.28 314.14 KB 97.09 KB 0.05s

lossy filter

the lossy filter has been improved significantly regarding the visual perception, even at low quality — so it would have new range: each 5 means new settings; -quality=100 down to -quality=45 (or less)

-quality=1
infile outfile time
431.34 KB 61.20 KB 0.06s
-quality=1 -s4
infile outfile time
431.34 KB 48.86 KB 0.29s

palettizer

the palettizer has been improved by quite margin regarding the visual perception, while it would not any dithering atm. it usually impact filesize a bit — could be more than this demo

1.27
infile outfile time
61.41 KB 6.27 KB 0.01s
1.28 (better visual perception)
infile outfile time
61.41 KB 6.30 KB 0.01s

near-lossless

significant changes also for near-lossless PNG/WebP: pingo would do several transform and adaptive compression that would lead to faster and results than precedent version. new range: each 5 means new settings, from -near=100 to -near=80 (or less)

1.45 MB
tool lvl out dssim time
cwebp 80 817.60 KB 0.00004711 0.74s
pingo 100 745.64 KB 0.00004065 0.26s
cwebp 60 756.57 KB 0.00008397 0.78s
pingo 95 685.03 KB 0.00008702 0.23s
cwebp 40 716.70 KB 0.00019907 0.81s
pingo 90 637.91 KB 0.00009669 0.24s
cwebp 20 697.91 KB 0.00051994 0.82s
pingo 85 614.61 KB 0.00012418 0.24s
cwebp 1 683.46 KB 0.00126561 0.84s
pingo 80 573.90 KB 0.00017888 0.26s

lossless

new profiles in this version: they would compress more densily, especially -s0 — see this benchmark — palette sorting has been improved again: -s3 and -s4 would save more bytes, should run as fast and would require a bit less memory than previous version

PNG

PNG lossless - palette-dr (128 files) — color with tRNS, encoded as palette
version lvl saved time mem
1.00 -s4 1187.12 KB 5.15s 76 MB
1.25 -s4 1475.43 KB 5.32s 90 MB
1.27.3 -s4 1705.48 KB 3.93s 171 MB
1.28 -s3 1703.96 KB 3.63s 143 MB
1.28 -s4 1713.68 KB 3.83s 143 MB
PNG lossless - palette-sx (200 files) — gray/color with (1) tRNS, *not* encoded as palette
version lvl saved time mem
1.00 -s4 6442.18 KB 7.41s 71 MB
1.25 -s4 6663.16 KB 7.94s 100 MB
1.27.3 -s4 6808.90 KB 5.85s 205 MB
1.28 -s3 6815.38 KB 5.64s 188 MB
1.28 -s4 6828.50 KB 5.85s 183 MB
PNG lossless - palette-xn (280 files) — gray/color with(out) tRNS, encoded as palette
version lvl saved time mem
1.00 -s4 2776.39 KB 10.19s 76 MB
1.25 -s4 3106.36 KB 10.75s 84 MB
1.27.3 -s4 3438.64 KB 8.01s 227 MB
1.28 -s3 3489.04 KB 7.59s 197 MB
1.28 -s4 3510.21 KB 8.01s 196 MB

note that those sets, or most of sets you could find here, would not only be related to palette sorting — other colortype, like grayscale, could occasionally produce smaller files

WebP

for WebP, lower profiles (-s0 and -s1) should be faster while savings more. profiles in WebP would be precedent version n-1 from -s2; new -s4 should do more savings but that would cost some time

PNG to WebP lossless - palette-dr (128 files) — color with tRNS, encoded as palette
version lvl saved time
1.27 -s0 1946.46 KB 1.87s
1.28 -s0 1965.76 KB 1.39s
1.27 -s1 2024.09 KB 2.15s
1.28 -s0 2043.23 KB 1.65s
1.27 -s4 2155.37 KB 4.28s
1.28 -s3 2155.37 KB 4.28s
1.28 -s4 2173.67 KB 4.73s
PNG to WebP lossless - palette-xn (280 files) — gray/color with(out) tRNS, encoded as palette
version lvl saved time
1.27 -s0 4036.16 KB 3.68s
1.28 -s0 4105.85 KB 2.83s
1.27 -s1 4339.08 KB 4.66s
1.28 -s1 4473.81 KB 3.93s
1.27 -s4 4776.87 KB 8.86s
1.28 -s3 4776.87 KB 8.86s
1.28 -s4 4803.05 KB 9.45s
PNG to WebP lossless - palette-sx (200 files) — gray/color with (1) tRNS, *not* encoded as palette
version lvl saved time
1.27.3 -s0 7464.41 KB 2.75s
1.28 -s0 7526.49 KB 2.12s
1.27.3 -s1 7565.54 KB 3.51s
1.28 -s1 7628.71 KB 3.09s
1.27.3 -s4 7781.25 KB 6.53s
1.28 -s3 7781.25 KB 6.53s
1.28 -s4 7795.51 KB 6.99s

behavior

during a conversion (PNG to WebP/JPEG), precedent version would stop if they could find the output — which means target file already exists. 1.28(+) would always process, and if the output already exists:

that way, the user could do multiple runs with differents settings (which could be done in lossless or lossy modes) and compare the gains over the precedent run. finally, if you want to go further or differently than pingo, you could see beeim — by using the right flags, it could probably compress more densely