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, 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

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

// 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

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.
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 profile feature is disabled.