2 releases
| new 0.1.2 | Dec 18, 2025 |
|---|---|
| 0.1.1 | Nov 19, 2025 |
| 0.1.0 |
|
#231 in Images
3MB
13K
SLoC
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 |
| 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
- Apache License, Version 2.0, (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
at your option.
References
Dependencies
~0.2–6.5MB
~99K SLoC