#xmp #exif #metadata #iptc

xmpkit

Pure Rust implementation of Adobe XMP Toolkit

2 releases

new 0.1.2 Dec 18, 2025
0.1.1 Nov 19, 2025
0.1.0 Nov 19, 2025

#231 in Images

MIT/Apache

3MB
13K SLoC

XMPKit

XMPKit Logo

Pure Rust implementation of Adobe XMP Toolkit

Crates.io MIT licensed Apache licensed, Version 2.0 Build Status

Overview

XMPKit is a pure Rust implementation of Adobe's XMP (Extensible Metadata Platform) Toolkit. It provides APIs for reading, writing, and manipulating XMP metadata in various file formats without any C++ dependencies.

Features

  • Pure Rust implementation
  • Compatible with Adobe XMP standard
  • Support for common file formats
  • Memory safe and high performance
  • Zero-cost abstractions
  • Cross-platform support

Optional Features

Feature Description
optimize-file-layout Optimize file layout for streaming (MPEG4: UUID box after moov, before mdat)

Note: MPEG4/MOV files automatically reconcile QuickTime native metadata (©nam, ©ART, cprt, etc.) to XMP by default. Use XmpOptions::only_xmp() to skip reconciliation.

Quick Start

use xmpkit::{XmpFile, XmpMeta, register_namespace};

// Open an image file
let mut file = XmpFile::new();
file.open("photo.jpg")?;

// Read XMP metadata
if let Some(meta) = file.get_xmp() {
    // Get image title (Dublin Core namespace - built-in, no registration needed)
    if let Some(title) = meta.get_property("http://purl.org/dc/elements/1.1/", "title") {
        println!("Title: {}", title);
    }

    // Get creator tool (XMP namespace - built-in, no registration needed)
    if let Some(creator) = meta.get_property("http://ns.adobe.com/xap/1.0/", "CreatorTool") {
        println!("Created with: {}", creator);
    }
}

// Modify metadata
if let Some(mut meta) = file.get_xmp().cloned() {
    // Set image title (built-in namespace, no registration needed)
    meta.set_property("http://purl.org/dc/elements/1.1/", "title", "My Photo")?;

    // Set creator tool (built-in namespace, no registration needed)
    meta.set_property("http://ns.adobe.com/xap/1.0/", "CreatorTool", "MyApp v1.0")?;

    // For custom namespaces, register first before setting properties
    register_namespace("http://example.com/myapp/1.0/", "myapp")?;
    meta.set_property("http://example.com/myapp/1.0/", "CustomProperty", "Custom Value")?;

    // Update metadata in file
    file.put_xmp(meta);
}

// Save the modified image
file.save("photo_updated.jpg")?;

Documentation

Full API documentation is available at docs.rs/xmpkit.

For WebAssembly/JavaScript integration, see WEBASSEMBLY.md, here is a online demo.

Project Status

File Format Support

Format Extensions Read XMP Write XMP Status
JPEG .jpg, .jpeg Yes Yes Fully supported
PNG .png Yes Yes Fully supported
GIF .gif Yes Yes Fully supported
WebP .webp Yes Yes Fully supported
SVG .svg Yes Yes Fully supported
TIFF .tif, .tiff Yes Yes Fully supported
HEIF .heif, .heic, .avif Yes Yes Fully supported
MP3 .mp3 Yes Yes Fully supported
WAV .wav Yes Yes Fully supported
AVI .avi Yes Yes Fully supported
MP4 .mp4, .m4a, .m4v Yes Yes Fully supported
MOV .mov Yes Yes Fully supported
PDF .pdf Yes Yes Fully supported
PSD .psd, .psb Yes Yes Fully supported

Platform Support

Platform Architecture File I/O Memory I/O Status
macOS x86_64, arm64 Yes Yes Fully supported
Linux x86_64, arm64 Yes Yes Fully supported
Windows x86_64, arm64 Yes Yes Fully supported
iOS arm64 Yes Yes Fully supported
Android arm64, armv7, x86_64 Yes Yes Fully supported
HarmonyOS arm64, armv7, x86_64 Yes Yes Fully supported
WebAssembly wasm32 No Yes Partially Supported

Contributing

Contributions are welcome! Please see CONTRIBUTING.md for guidelines.

License

This project is licensed under either of

at your option.

References

Dependencies

~0.2–6.5MB
~99K SLoC