Expand description
§jpegli
Pure Rust JPEG encoder with perceptual optimizations.
jpegli provides enhanced compression quality compared to standard JPEG through adaptive quantization, optional XYB color space, and other perceptual optimizations.
§Quick Start
ⓘ
use jpegli::encoder::{EncoderConfig, ChromaSubsampling, PixelLayout, Unstoppable};
// Create reusable config (quality + color mode in constructor)
let config = EncoderConfig::ycbcr(85, ChromaSubsampling::Quarter)
.progressive(true);
// Encode from raw bytes
let mut enc = config.encode_from_bytes(1920, 1080, PixelLayout::Rgb8Srgb)?;
enc.push_packed(&rgb_bytes, Unstoppable)?;
let jpeg = enc.finish()?;§Encoder API
All encoder types are in encoder:
ⓘ
use jpegli::encoder::{
// Core types
EncoderConfig, // Builder for encoder configuration
BytesEncoder, // Encoder for raw byte buffers
RgbEncoder, // Encoder for rgb crate types
YCbCrPlanarEncoder, // Encoder for planar YCbCr
// Configuration
Quality, // Quality settings (ApproxJpegli, ApproxMozjpeg, etc.)
PixelLayout, // Pixel format for raw bytes
ChromaSubsampling, // 4:4:4, 4:2:0, 4:2:2, 4:4:0
ColorMode, // YCbCr, XYB, Grayscale
DownsamplingMethod, // Box, GammaAware, GammaAwareIterative
// Cancellation
Stop, // Trait for cancellation tokens
Unstoppable, // Use when no cancellation needed
// Results
Error, Result, // Error handling
};§Three Entry Points
| Method | Input Type | Use Case |
|---|---|---|
encoder::EncoderConfig::encode_from_bytes | &[u8] | Raw byte buffers |
encoder::EncoderConfig::encode_from_rgb | rgb crate types | Type-safe pixels |
encoder::EncoderConfig::encode_from_ycbcr_planar | YCbCrPlanes | Video pipelines |
§Configuration Options
ⓘ
// YCbCr mode (standard JPEG - most compatible)
let config = EncoderConfig::ycbcr(85, ChromaSubsampling::Quarter)
.progressive(true) // Progressive JPEG (~3% smaller)
.sharp_yuv(true) // Better color edges (~3x slower)
.icc_profile(bytes); // Attach ICC profile
// XYB mode (perceptual color space - better quality)
let config = EncoderConfig::xyb(85, XybSubsampling::BQuarter)
.progressive(true);
// Grayscale mode
let config = EncoderConfig::grayscale(85);
// Quality can also use enum variants:
let config = EncoderConfig::ycbcr(Quality::ApproxSsim2(90.0), ChromaSubsampling::None);
let config = EncoderConfig::ycbcr(Quality::ApproxButteraugli(1.0), ChromaSubsampling::Quarter);§Decoder API
The decoder is in prerelease. Enable with features = ["decoder"].
ⓘ
#[cfg(feature = "decoder")]
use jpegli::decoder::{Decoder, DecodedImage};
let image = Decoder::new().decode(&jpeg_data)?;
let pixels: &[u8] = image.pixels();§Feature Flags
| Feature | Default | Description |
|---|---|---|
decoder | No | Enable decoder API (prerelease) |
parallel | No | Multi-threaded encoding via rayon |
cms-lcms2 | Yes | Color management via lcms2 |
cms-moxcms | No | Pure Rust color management |
unsafe_simd | No | Raw AVX2/SSE intrinsics (~10-20% faster) |
§Capabilities
- Baseline JPEG: Standard 8-bit JPEG encoding
- Progressive JPEG: Multi-scan encoding (~3% smaller files)
- XYB Color Space: Perceptually optimized for better quality
- Adaptive Quantization: Content-aware bit allocation
- 16-bit / f32 Input: High bit-depth source support
- Streaming API: Memory-efficient row-by-row encoding
- Parallel Encoding: Multi-threaded for large images
Modules§
- encoder
- JPEG encoder - public API.
- heuristics
- Resource estimation heuristics for encoding and decoding.
- profile
- Lightweight text-based profiling for encoder phases.
Macros§
- profile_
block - Profile a block and return its value.
- profile_
scope - Profile a scope. Zero-cost when
profilefeature is disabled.