@@ -17,41 +17,41 @@ Photon is WebAssembly, and so is jsquash (Squoosh's libavif and libjxl, for AVIF
1717
1818## Numbers
1919
20- Time per operation (less is faster), measured 2026-11-08 with Node.js v24.22.2 on AMD EPYC 7763 64-Core Processor, ImageScript 3.19 .0.
20+ Time per operation (less is faster), measured 2026-11-08 with Node.js v24.22.2 on AMD EPYC 7763 64-Core Processor, ImageScript 3.20 .0.
2121
2222| | ** ImageScript** | ** Jimp** | ** image-js** | ** PureJsImage** | ** Photon** | ** sharp** | ** jsquash** | ** @napi-rs/canvas ** |
2323| ---| --:| --:| --:| --:| --:| --:| --:| --:|
24- | decode JPEG | ** 72 ms** | 162 ms | 189 ms | 133 ms | 47 ms | 14 ms | – | 21 ms |
25- | decode PNG | ** 29 ms** | 63 ms | 116 ms | 80 ms | 25 ms | 19 ms | – | 19 ms |
26- | decode WebP (lossy) | ** 92 ms** | – | – | 104 ms | 90 ms | 28 ms | – | 17 ms |
27- | decode AVIF | ** 242 ms** | – | – | 1.9 s | – | 80 ms | 224 ms | 64 ms |
28- | decode JPEG XL | ** 400 ms** | – | – | fails | – | – | 462 ms | 73 ms |
29- | decode animated GIF | ** 64 ms** | – | – | – | – | 70 ms | – | – |
30- | decode animated WebP | ** 289 ms** | – | – | – | – | 291 ms | – | – |
31- | encode JPEG (quality 80) | ** 64 ms** | 409 ms | 107 ms | 143 ms | 113 ms | 18 ms | – | 29 ms |
32- | encode PNG | ** 178 ms** | 244 ms | 340 ms | 548 ms | 102 ms | 136 ms | – | 469 ms |
33- | encode WebP (quality 80) | ** 211 ms** | – | – | 134 ms | – | 187 ms | – | 159 ms |
34- | encode WebP (lossless) | ** 1.3 s** | – | – | 2.8 s | 43 ms | 1.6 s | – | 498 ms |
24+ | decode JPEG | ** 79 ms** | 151 ms | 203 ms | 132 ms | 47 ms | 15 ms | – | 21 ms |
25+ | decode PNG | ** 31 ms** | 64 ms | 117 ms | 84 ms | 25 ms | 19 ms | – | 19 ms |
26+ | decode WebP (lossy) | ** 90 ms** | – | – | 104 ms | 89 ms | 28 ms | – | 17 ms |
27+ | decode AVIF | ** 252 ms** | – | – | 1.9 s | – | 81 ms | 222 ms | 61 ms |
28+ | decode JPEG XL | ** 400 ms** | – | – | fails | – | – | 463 ms | 67 ms |
29+ | decode animated GIF | ** 63 ms** | – | – | – | – | 70 ms | – | – |
30+ | decode animated WebP | ** 291 ms** | – | – | – | – | 291 ms | – | – |
31+ | encode JPEG (quality 80) | ** 62 ms** | 410 ms | 109 ms | 144 ms | 114 ms | 18 ms | – | 29 ms |
32+ | encode PNG | ** 177 ms** | 239 ms | 371 ms | 545 ms | 102 ms | 140 ms | – | 467 ms |
33+ | encode WebP (quality 80) | ** 207 ms** | – | – | 136 ms | – | 189 ms | – | 159 ms |
34+ | encode WebP (lossless) | ** 1.2 s** | – | – | 2.8 s | 44 ms | 1.5 s | – | 488 ms |
3535| encode AVIF (quality 60) | ** 5.2 s** | – | – | 1.4 s | – | 2.6 s | 2.4 s | – |
3636| encode JPEG XL (quality 90) | ** 2.2 s** | – | – | – | – | – | 2.5 s | – |
37- | encode JPEG XL (lossless) | ** 766 ms** | – | – | – | – | – | 450 ms | – |
38- | encode animated GIF | ** 228 ms** | – | – | – | – | 1.2 s | – | – |
39- | encode animated WebP (q 80) | ** 1.0 s ** | – | – | – | – | 780 ms | – | – |
40- | resize to half | ** 13 ms** | 17 ms | 93 ms | 64 ms | 66 ms | 9.5 ms | – | 3.0 ms |
41- | resize to half, bicubic | ** 72 ms** | 203 ms | 389 ms | – | 104 ms | 11 ms | – | – |
42- | thumbnail (cover 400×400) | ** 15 ms** | 51 ms | – | 41 ms | – | 5.7 ms | – | 1.4 ms |
43- | crop | ** 1.2 ms** | 19 ms | 15 ms | 10 ms | 5.2 ms | 0.99 ms | – | 0.91 ms |
44- | rotate by 30° | ** 41 ms** | 600 ms | 741 ms | 512 ms | 214 ms | 41 ms | – | 28 ms |
37+ | encode JPEG XL (lossless) | ** 813 ms** | – | – | – | – | – | 447 ms | – |
38+ | encode animated GIF | ** 230 ms** | – | – | – | – | 1.2 s | – | – |
39+ | encode animated WebP (q 80) | ** 998 ms ** | – | – | – | – | 779 ms | – | – |
40+ | resize to half | ** 13 ms** | 17 ms | 93 ms | 65 ms | 67 ms | 9.5 ms | – | 3.1 ms |
41+ | resize to half, bicubic | ** 72 ms** | 201 ms | 389 ms | – | 106 ms | 11 ms | – | – |
42+ | thumbnail (cover 400×400) | ** 20 ms** | 51 ms | – | 41 ms | – | 5.7 ms | – | 1.3 ms |
43+ | crop | ** 1.4 ms** | 18 ms | 15 ms | 10 ms | 5.4 ms | 0.97 ms | – | 0.81 ms |
44+ | rotate by 30° | ** 40 ms** | 597 ms | 743 ms | 508 ms | 214 ms | 40 ms | – | 27 ms |
4545| rotate by 90° | ** 12 ms** | 49 ms | 23 ms | 128 ms | 147 ms | 4.8 ms | – | 13 ms |
46- | flip | ** 2.0 ms** | 100 ms | 13 ms | 60 ms | 20 ms | 4.3 ms | – | 9.9 ms |
47- | blur (radius 5) | ** 77 ms** | 91 s | 861 ms | – | 154 ms | 19 ms | – | 17 ms |
48- | sharpen | ** 205 ms** | – | – | – | 105 ms | 213 ms | – | – |
49- | composite an overlay | ** 2.3 ms** | 34 ms | 8.4 ms | – | 6.2 ms | 5.6 ms | – | 2.6 ms |
50- | greyscale | ** 6.9 ms** | 118 ms | 20 ms | – | 6.7 ms | 26 ms | – | 7.4 ms |
51- | brightness and contrast | ** 11 ms** | 274 ms | – | – | 28 ms | 15 ms | – | 14 ms |
52- | render text | ** 0.55 ms** | – | – | – | – | 0.59 ms | – | 0.48 ms |
53- | render SVG | ** 158 ms** | – | – | – | – | 39 ms | – | 12 ms |
54- | thumbnail, keeping HDR | ** 186 ms** | – | – | – | – | 160 ms | – | – |
46+ | flip | ** 2.3 ms** | 100 ms | 13 ms | 59 ms | 20 ms | 4.3 ms | – | 10 ms |
47+ | blur (radius 5) | ** 77 ms** | 80 s | 857 ms | – | 153 ms | 18 ms | – | 16 ms |
48+ | sharpen | ** 217 ms** | – | – | – | 105 ms | 211 ms | – | – |
49+ | composite an overlay | ** 2.6 ms** | 41 ms | 8.8 ms | – | 6.1 ms | 5.4 ms | – | 2.4 ms |
50+ | greyscale | ** 6.7 ms** | 123 ms | 20 ms | – | 6.7 ms | 26 ms | – | 7.2 ms |
51+ | brightness and contrast | ** 11 ms** | 273 ms | – | – | 28 ms | 14 ms | – | 13 ms |
52+ | render text | ** 0.54 ms** | – | – | – | – | 0.63 ms | – | 0.33 ms |
53+ | render SVG | ** 152 ms** | – | – | – | – | 38 ms | – | 11 ms |
54+ | thumbnail, keeping HDR | ** 191 ms** | – | – | – | – | 161 ms | – | – |
5555
5656Encoded sizes:
5757
@@ -77,7 +77,7 @@ Encoded sizes:
7777| | ** ImageScript** | ** Jimp** | ** image-js** | ** PureJsImage** | ** Photon** | ** sharp** | ** jsquash** | ** @napi-rs/canvas ** |
7878| ---| ---| ---| ---| ---| ---| ---| ---| ---|
7979| kind | JavaScript | JavaScript | JavaScript | JavaScript | WebAssembly | native (libvips) | WebAssembly | native (Skia) |
80- | package | ` imagescript@3.19 .0 ` | ` jimp@1.6.1 ` | ` image-js@1.7.1 ` | ` purejsimage@0.17.0 ` | ` @silvia-odwyer/photon-node@0.3.4 ` | ` sharp@0.35.5 ` | ` @jsquash/avif@2.1.1 @jsquash/jxl@1.3.0 ` | ` @napi-rs/canvas@1.0.11 ` |
80+ | package | ` imagescript@3.20 .0 ` | ` jimp@1.6.1 ` | ` image-js@1.7.1 ` | ` purejsimage@0.17.0 ` | ` @silvia-odwyer/photon-node@0.3.4 ` | ` sharp@0.35.5 ` | ` @jsquash/avif@2.1.1 @jsquash/jxl@1.3.0 ` | ` @napi-rs/canvas@1.0.11 ` |
8181| install size | 2.5 MB | 26.8 MB | 47.8 MB | 6.7 MB | 2.3 MB | 20.3 MB | 14.2 MB | 35.0 MB |
8282| packages | 1 | 64 | 55 | 1 | 1 | 6 | 3 | 2 |
8383
0 commit comments