exiftool-rs 0.2.0

Read, write, and edit metadata in 55+ file formats — a pure Rust reimplementation of ExifTool with 100% tag name parity (194/194 test files)
Documentation

exiftool-rs

Crates.io Documentation License: GPL-3.0

A pure Rust reimplementation of ExifTool — read, write, and edit metadata in image, audio, video, and document files. No unsafe code, no Perl dependency, no system libraries.

Features

  • 194/194 test files (100%) produce identical tag names as Perl ExifTool v13.52
  • 55+ format readers: JPEG, TIFF, PNG, CR2, CR3, CRW, PSD, WebP, HEIF/AVIF, MP4/MOV, AVI, MKV, MTS, PDF, WAV, FLAC, MP3, OGG, BMP, GIF, DNG, NEF, ARW, ORF, RAF, RW2, PEF, X3F, IIQ, EIP, MIE, MIFF, MRC, DICOM, WTV, DjVu, BPG, XCF, LFP, FPF, and more
  • 15 format writers: JPEG, TIFF, PNG, WebP, PSD, PDF, MP4, MKV, AVI, WAV, FLAC, MP3, OGG, CR2, HEIF/AVIF
  • 15+ MakerNote manufacturers: Canon, Nikon, Sony, Pentax, Olympus, Panasonic, Fujifilm, Samsung, Sigma, Casio, Ricoh, Minolta, Apple, Google, FLIR, GE, GoPro
  • Deep sub-table decoders: Canon ColorData/CustomFunctions/ShotInfo, Nikon NikonCapture/ScanIFD, Panasonic RW2, Pentax CameraSettings, and more
  • Specialized parsers: GoPro GPMF, InfiRay thermal, FlashPix/OLE, Canon VRD/CIFF, MPF, MIE, Lytro LFP, FLIR FPF, Sigma X3F, CaptureOne EIP, and more
  • No unsafe code, minimal dependencies

Library Usage

use exiftool_rs::ExifTool;

let et = ExifTool::new();
let tags = et.extract_info("photo.jpg").unwrap();
for tag in &tags {
    println!("{}: {}", tag.name, tag.print_value);
}

CLI Usage

# Install
cargo install exiftool-rs

# Read metadata
exiftool-rs photo.jpg

# Short tag names
exiftool-rs -s photo.jpg

# JSON output
exiftool-rs -j photo.jpg

# Write tags
exiftool-rs -Artist="John Doe" -Copyright="2024" photo.jpg

# Show groups
exiftool-rs -G photo.jpg

# Numeric values
exiftool-rs -n photo.jpg

CLI Options

Option Description
-s Short tag names
-s2 Very short (tag names only)
-G Show group names
-n Numeric output (no print conversion)
-j JSON output
-csv CSV output
-X XML/RDF output
-b Binary output (thumbnails, etc.)
-r Recursively scan directories
-ext EXT Process only files with extension EXT
-TAG Extract specific tag(s)
-ver Show version
-TAG=VALUE Write tag
-TAG= Delete tag
-overwrite_original Overwrite without backup
-stay_open True Keep running, read commands from stdin

Testing

# Unit tests
cargo test

# ISO-functional test against Perl ExifTool's 194 test files
# No Perl required — reference files included in tests/expected/
./scripts/test_iso.sh

# 194/194 files (100%) produce identical tag names — 11625 tags verified

Building

git clone https://github.com/Le-Syl21/exiftool-rs
cd exiftool-rs
cargo build --release

License

GPL-3.0-or-later (same as the original Perl ExifTool)

Authors

  • Sylvain (@Le-Syl21) — Project creator
  • Claude (Anthropic) — Implementation

Acknowledgements

Based on ExifTool by Phil Harvey. Tag tables and print conversions are generated from the ExifTool Perl source.