Crate jpegli

Crate jpegli 

Source
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, PixelLayout, Unstoppable};

// Create reusable config
let config = EncoderConfig::new()
    .quality(85)
    .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

MethodInput TypeUse Case
encoder::EncoderConfig::encode_from_bytes&[u8]Raw byte buffers
encoder::EncoderConfig::encode_from_rgbrgb crate typesType-safe pixels
encoder::EncoderConfig::encode_from_ycbcr_planarYCbCrPlanesVideo pipelines

§Configuration Options

let config = EncoderConfig::new()
    .quality(85)                              // 0-100 scale
    .quality(Quality::ApproxSsim2(90.0))      // Target SSIMULACRA2 score
    .quality(Quality::ApproxButteraugli(1.0)) // Target butteraugli distance
    .progressive(true)                        // Progressive JPEG (~3% smaller)
    .ycbcr(ChromaSubsampling::Quarter)        // 4:2:0 (default is 4:4:4)
    .xyb()                                    // XYB perceptual color space
    .grayscale()                              // Single-channel output
    .sharp_yuv(true)                          // Better color edges (~3x slower)
    .icc_profile(bytes);                      // Attach ICC profile

§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

FeatureDefaultDescription
decoderNoEnable decoder API (prerelease)
parallelNoMulti-threaded encoding via rayon
cms-lcms2YesColor management via lcms2
cms-moxcmsNoPure Rust color management
unsafe_simdNoRaw 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.