Example use-case
In the https://pixa.pics/ project, we enable people to draw pixel arts into a 2d canvas, it must store the image source, all modification for undo/redo (our history system is dumb, we don't store reverse operations rather than the whole change...) and the thumbnail with metadata, it auto-save a compressed blob into the browser and it is quite fast within a web worker, it doesn't freeze the UI.
Compression benchmarks
Here are some representative speeds and sizes for the various algorithms implemented in the original package (https://github.com/eladkarako/compressjs-flattened). Times are with node 0.8.22 on my laptop, but they should be valid for inter-algorithm comparisons.
Text / Test
This is the Taoism article from the Simple English wikipedia, in HTML format as generated by the Wikipedia Parsoid project.
Type | Level | Size (bytes) | Compress time (s) | Decompress time (s) |
---|---|---|---|---|
bwtc | 9 | 272997 | 13.10 | 1.85 |
bzip2 | 9 | 275087 | 22.57 | 1.21 |
lzp3 | - | 292978 | 1.73 | 1.74 |
ppm | - | 297220 | 42.05 | 44.04 |
bzip2 | 1 | 341615 | 22.63 | 1.40 |
bwtc | 1 | 345764 | 12.34 | 0.80 |
dmc | - | 434182 | 6.97 | 9.00 |
lzjbr | 9 | 491476 | 3.19 | 1.92 |
lzjbr | 1 | 523780 | 2.76 | 2.02 |
lzjb | 9 | 706210 | 1.02 | 0.30 |
lzjb | 1 | 758467 | 0.66 | 0.29 |
context1 | - | 939098 | 5.20 | 4.69 |
fenwick | - | 1440645 | 3.06 | 3.72 |
mtf | - | 1441763 | 1.92 | 3.86 |
huffman | - | 1452055 | 7.15 | 6.56 |
simple | - | 1479143 | 0.72 | 2.42 |
defsum | - | 1491107 | 3.19 | 1.46 |
no | - | 2130648 | 0.80 | 0.92 |
- | - | 2130640 | - | - |
var func = async function(uint8a_or_obj, mode) {return new Promise(function(resolve, reject){
...
if(mode === "COMPRESS_OBJECT") {
// JS -> json_str -> ui8a -> compressed ui8a
resolve(Uint8Array.from(Lzp3.compressFile(new TextEncoder("utf-8").encode(JSON.stringify(uint8a_or_obj, null, 0)))));
}else if(mode === "DECOMPRESS_UINT8A") {
// ui8a decompressed -> ui8a -> json_str -> JS
resolve(JSON.parse(new TextDecoder().decode(Uint8Array.from(Lzp3.decompressFile(uint8a_or_obj)))));
}else {
reject(null);
}
})};
Real implementation: https://github.com/pixa-pics/pixa-pics.github.io/blob/main/src/js/utils/lzp3_json.js
var blob = new Blob([uint8a], {type : "application/octet-stream"}); /* ... */
blob.arrayBuffer().then((array_buffer) => {var uint8a = new Uint8Array(array_buffer); /* ... */ });
Top comments (0)