| Crates.io | xmpkit |
| lib.rs | xmpkit |
| version | 0.1.2 |
| created_at | 2025-11-19 07:47:54.352241+00 |
| updated_at | 2025-12-18 14:08:27.244153+00 |
| description | Pure Rust implementation of Adobe XMP Toolkit |
| homepage | |
| repository | https://github.com/cavivie/xmpkit |
| max_upload_size | |
| id | 1939590 |
| size | 4,120,812 |
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.
| 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.
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")?;
Full API documentation is available at docs.rs/xmpkit.
For WebAssembly/JavaScript integration, see WEBASSEMBLY.md, here is a online demo.
| 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 | 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 |
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
This project is licensed under either of
at your option.