Skip to content

Formats Reference

Complete list of formats supported by Cambium converters.

Serde Formats (cambium-serde)

All serde formats use serde_json::Value as an intermediate representation, enabling conversion between any pair of enabled formats.

Text Formats

FormatFeatureExtensionsNotes
JSONjson.jsonDefault enabled
YAMLyaml.yaml, .ymlDefault enabled
TOMLtoml.tomlDefault enabled
RONron.ronRust Object Notation
JSON5json5.json5JSON with comments, trailing commas
XMLxml.xmlVia quick-xml
S-expressionslexpr.lisp, .sexpLisp-style
URL-encodedurlencoded-Form data
Query stringsqs-Nested query params

Binary Formats

FormatFeatureExtensionsNotes
MessagePackmsgpack.msgpack, .mpCompact binary JSON-like
CBORcbor.cborConcise Binary Object Representation
Bincodebincode.bincode, .bcRust-native binary
Postcardpostcard.postcard, .pcEmbedded-friendly
BSONbson.bsonMongoDB binary format
FlexBuffersflexbuffers.flexbufSchema-less FlatBuffers
Bencodebencode.bencode, .torrentBitTorrent format
Picklepickle.pickle, .pklPython serialization
Property Listplist.plistApple binary plist

Feature Groups

toml
# Cargo.toml for cambium-serde
[features]
default = ["json", "yaml", "toml"]
all = ["json", "yaml", "toml", "ron", "json5", "xml", "lexpr",
       "urlencoded", "qs", "msgpack", "cbor", "bincode", "postcard",
       "bson", "flexbuffers", "bencode", "pickle", "plist"]

Image Formats (cambium-image)

All image formats use image::DynamicImage as an intermediate representation.

Lossless Formats

FormatFeatureExtensionsNotes
PNGpng.pngDefault enabled
GIFgif.gifDefault enabled, animated support
BMPbmp.bmpWindows bitmap
ICOico.icoWindows icon
TIFFtiff.tif, .tiffTagged image
TGAtga.tgaTruevision
PNMpnm.pnm, .pbm, .pgm, .ppm, .pamPortable anymap family
Farbfeldfarbfeld.ffSimple lossless
QOIqoi.qoiQuite OK Image

Lossy Formats

FormatFeatureExtensionsNotes
JPEGjpeg.jpg, .jpegDefault enabled
WebPwebp.webpDefault enabled
AVIFavif.avifAV1-based

HDR Formats

FormatFeatureExtensionsNotes
OpenEXRopenexr.exrHigh dynamic range
Radiance HDRhdr.hdrRGBE format

Feature Groups

toml
# Cargo.toml for cambium-image
[features]
default = ["png", "jpeg", "webp", "gif"]
all = ["png", "jpeg", "webp", "gif", "bmp", "ico", "tiff", "tga",
       "pnm", "farbfeld", "qoi", "avif", "openexr", "hdr"]

Image Transforms

Beyond format conversion, cambium-image provides transform operations:

ConverterDescriptionOptions
image.resizeResize imagemax_width, max_height, scale, target_width, target_height
image.crop-aspectCrop to aspect ratioaspect (e.g., "16:9"), gravity
image.watermarkOverlay watermarkposition, opacity, margin (multi-input)

Resize options:

  • max_width / max_height: Fit within bounds, preserving aspect ratio (no upscaling)
  • scale: Scale factor (e.g., 0.5 for half size)
  • target_width / target_height: Exact dimensions (may change aspect ratio)

Gravity presets (for crop anchor point):

PresetAliases
top-leftnw, northwest
topn, north
top-rightne, northeast
leftw, west
centerc, middle (default)
righte, east
bottom-leftsw, southwest
bottoms, south
bottom-rightse, southeast

CLI usage:

bash
# Resize to fit within 1024px width
cambium convert photo.png photo.webp --max-width 1024

# Scale to 50%
cambium convert photo.png thumb.png --scale 0.5

# Crop to 16:9, keeping top of image
cambium convert photo.png banner.png --aspect 16:9 --gravity top

# Combine: crop to square, resize, convert format
cambium convert photo.png avatar.webp --aspect 1:1 --max-width 200

# Add watermark
cambium convert photo.png branded.png --watermark logo.png

# Watermark with options
cambium convert photo.png branded.png --watermark logo.png \
  --watermark-position bottom-right --watermark-opacity 0.5 --watermark-margin 20

Watermark options:

  • position: Where to place the watermark (uses gravity presets above)
  • opacity: Watermark transparency (0.0-1.0, default 1.0)
  • margin: Pixels from edge (default 0)

Audio Formats (cambium-audio)

Pure Rust audio processing via Symphonia (decode) and Hound (WAV encode).

Supported Formats

FormatDecodeEncodeFeature
WAVwav
FLAC-flac
MP3-mp3
OGG Vorbis-ogg
AAC-aac

Note: Currently all formats decode to WAV. Encoders for other formats are planned.

Feature Groups

toml
# Cargo.toml for cambium-audio
[features]
default = ["wav", "flac", "mp3", "ogg"]
all = ["wav", "flac", "mp3", "ogg", "aac"]

CLI usage:

bash
# Convert MP3 to WAV
cambium convert song.mp3 song.wav

# Convert FLAC to WAV
cambium convert album.flac album.wav

# Convert OGG to WAV
cambium convert audio.ogg audio.wav

Video Formats (cambium-video)

All video formats use FFmpeg as the transcoding backend. Requires FFmpeg installed at runtime.

Container Formats

FormatFeatureExtensionsDefault Codecs
MP4mp4.mp4, .m4vH.264 + AAC
WebMwebm.webmVP9 + Opus
MKVmkv.mkvH.264 + AAC
AVIavi.aviMPEG-4 + MP3
MOVmov.mov, .qtH.264 + AAC
GIFgif.gifGIF (animated)

Feature Groups

toml
# Cargo.toml for cambium-video
[features]
default = ["mp4", "webm", "gif"]
all = ["mp4", "webm", "mkv", "avi", "mov", "gif", "audio"]

Video Transforms

ConverterDescriptionOptions
video.resizeResize videomax_width, max_height, scale

Quality Presets

PresetCRFUse Case
low28Smaller file size
medium23Balanced (default)
high18Higher quality
lossless0No quality loss

CLI usage:

bash
# Convert MP4 to WebM
cambium convert video.mp4 video.webm

# Convert with quality preset
cambium convert video.mp4 video.webm --quality high

# Resize video
cambium convert video.mp4 small.mp4 --max-width 720

# GIF to video
cambium convert animation.gif video.mp4

CLI Feature Flags

The CLI combines all converter backends:

toml
# Cargo.toml for cambium-cli
[features]
default = ["serde", "image"]

# Include backends
serde = ["dep:cambium-serde"]
image = ["dep:cambium-image"]
video = ["dep:cambium-video"]  # Requires FFmpeg
audio = ["dep:cambium-audio"]

# Enable all formats per backend
serde-all = ["serde", "cambium-serde/all"]
image-all = ["image", "cambium-image/all"]
video-all = ["video", "cambium-video/all"]
audio-all = ["audio", "cambium-audio/all"]

# Everything (video excluded from default, requires FFmpeg)
all = ["serde-all", "image-all", "video-all", "audio-all"]

Installation Examples

bash
# Default: common serde + common image formats
cargo install cambium-cli

# All formats
cargo install cambium-cli --features all

# Only serde formats (no image support)
cargo install cambium-cli --no-default-features --features serde-all

# Only image formats (no serde support)
cargo install cambium-cli --no-default-features --features image-all

# Specific formats only
cargo install cambium-cli --no-default-features \
  --features cambium-serde/json,cambium-serde/yaml,cambium-image/png

Converter Naming

Converters follow the pattern {crate}.{from}-to-{to}:

  • serde.json-to-yaml
  • serde.toml-to-msgpack
  • image.png-to-webp
  • image.jpg-to-gif

List all available converters:

bash
cambium list

Adding Custom Converters

Implement the Converter trait:

rust
use cambium::{Converter, ConverterDecl, ConvertError, ConvertOutput, Properties, PropertyPattern};

pub struct MyConverter {
    decl: ConverterDecl,
}

impl MyConverter {
    pub fn new() -> Self {
        let decl = ConverterDecl::simple(
            "my.foo-to-bar",
            PropertyPattern::new().eq("format", "foo"),
            PropertyPattern::new().eq("format", "bar"),
        ).description("Convert foo to bar");

        Self { decl }
    }
}

impl Converter for MyConverter {
    fn decl(&self) -> &ConverterDecl {
        &self.decl
    }

    fn convert(&self, input: &[u8], props: &Properties) -> Result<ConvertOutput, ConvertError> {
        // Transform input bytes to output bytes
        let output = transform(input)?;

        let mut out_props = props.clone();
        out_props.insert("format".into(), "bar".into());

        Ok(ConvertOutput::Single(output, out_props))
    }
}

Register with a registry:

rust
let mut registry = Registry::new();
registry.register(MyConverter::new());