A faster fork of the Zopfli DEFLATE compressor, written in Rust.
Zopfli produces near-optimal DEFLATE output at the cost of speed. zenzop produces byte-identical output 1.2–2x faster through algorithmic improvements: precomputed cost tables, SIMD-accelerated match comparison, arena-based Huffman tree construction, pre-allocated stores, and a skip-hash optimization that eliminates redundant hash chain walks on cached iterations.
With enhanced mode enabled, zenzop applies ECT-derived optimizations — expanded precode search, multi-strategy Huffman tree selection, and enhanced parser diversification — to produce smaller output than standard Zopfli at the cost of byte-for-byte parity with the C reference.
- Byte-identical output to C Zopfli (default mode)
- Enhanced mode for smaller-than-Zopfli output (beats ECT-9 at equivalent iterations)
- 1.2–2x faster than C Zopfli (input-dependent; larger gains on smaller blocks)
no_std+alloccompatible — works on embedded and WASM targets- Cooperative cancellation via
enough::Stop— cancel long-running compressions cleanly - Streaming encoder API —
DeflateEncoder,GzipEncoder,ZlibEncoder - Parallel block compression with optional
rayonsupport
Add to your Cargo.toml:
[dependencies]
zenzop = "0.4"use std::io;
fn main() -> io::Result<()> {
let data = b"Hello, world!";
let mut output = Vec::new();
zenzop::compress(
zenzop::Options::default(),
zenzop::Format::Gzip,
&data[..],
&mut output,
)?;
Ok(())
}use std::io;
fn main() -> io::Result<()> {
let data = b"Hello, world!";
let mut output = Vec::new();
let mut options = zenzop::Options::default();
options.enhanced = true;
zenzop::compress(options, zenzop::Format::Gzip, &data[..], &mut output)?;
Ok(())
}Enhanced mode produces smaller DEFLATE output than standard Zopfli with ~5% runtime overhead. At 60 iterations it beats ECT-9 on representative test data.
use std::io::{self, Write};
fn main() -> io::Result<()> {
let mut encoder = zenzop::DeflateEncoder::new_buffered(
zenzop::Options::default(),
Vec::new(),
);
encoder.write_all(b"Hello, world!")?;
let compressed = encoder.into_inner()?.finish()?.into_inner();
Ok(())
}use std::io::{self, Write};
fn compress_cancellable(data: &[u8], stop: impl zenzop::Stop) -> io::Result<Vec<u8>> {
let mut encoder = zenzop::GzipEncoder::with_stop_buffered(
zenzop::Options::default(),
Vec::new(),
stop,
)?;
encoder.write_all(data)?;
let result = encoder.into_inner()?.finish()?;
if !result.fully_optimized() {
eprintln!("compression was cut short by timeout");
}
Ok(result.into_inner())
}| Feature | Default | Description |
|---|---|---|
gzip |
yes | Gzip format support |
zlib |
yes | Zlib format support |
std |
yes | Standard library (logging, std::io traits) |
parallel |
no | Parallel block compression via rayon |
For no_std usage: default-features = false.
The minimum supported Rust version is 1.89. Bumping this is not considered a breaking change.
cargo build --release
The zenzop binary will be at target/release/zenzop.
cargo test # Unit tests + property-based tests
./test/run.sh # Golden master: byte-identical to C Zopfli
| State of the art codecs* | zenjpeg · zenpng · zenwebp · zengif · zenavif (rav1d-safe · zenrav1e · zenavif-parse · zenavif-serialize) · zenjxl (jxl-encoder · zenjxl-decoder) · zentiff · zenbitmaps · heic · zenraw · zenpdf · ultrahdr · mozjpeg-rs · webpx |
| Compression | zenflate · zenzop |
| Processing | zenresize · zenfilters · zenquant · zenblend |
| Metrics | zensim · fast-ssim2 · butteraugli · resamplescope-rs · codec-eval · codec-corpus |
| Pixel types & color | zenpixels · zenpixels-convert · linear-srgb · garb |
| Pipeline | zenpipe · zencodec · zencodecs · zenlayout · zennode |
| ImageResizer | ImageResizer (C#) — 24M+ NuGet downloads across all packages |
| Imageflow | Image optimization engine (Rust) — .NET · node · go — 9M+ NuGet downloads across all packages |
| Imageflow Server | The fast, safe image server (Rust+C#) — 552K+ NuGet downloads, deployed by Fortune 500s and major brands |
* as of 2026
archmage · magetypes · enough · whereat · zenbench · cargo-copter
And other projects · GitHub @imazen · GitHub @lilith · lib.rs/~lilith · NuGet (over 30 million downloads / 87 packages)
Apache-2.0
This is a fork of google/zopfli (Apache-2.0). We are willing to release our improvements under the original Apache-2.0 license if upstream takes over maintenance of those improvements. We'd rather contribute back than maintain a parallel codebase. Open an issue or reach out.
Forked from zopfli-rs/zopfli, which was Carol Nichols' Rust reimplementation of Google's Zopfli. Enhanced mode optimizations derived from ECT (Efficient Compression Tool).
Developed with Claude (Anthropic). Not all code manually reviewed. Review critical paths before production use.