Skip to content

Repository files navigation

exiftool-rs

Crates.ioDocumentationParityLicense: GPL-3.0Discord

A pure Rust reimplementation of ExifTool v13.59 — read, write, and edit metadata in image, audio, video, and document files. No Perl dependency, no system libraries; unsafe is confined to three OS calls (locale lookup, local-time offset, and an optional memory-map for large files).

Screenshot

Community & support

Questions, bug reports, beta testing, or just want to chat? Join the Discord:

Discord

Features

  • Byte-for-byte parity with Perl ExifTool v13.59 across all 195 corpus files — identical tag names, values, groups, and repeated-instance (-ee) output. Proven live and regenerated by CI on every push: the parity report diffs every tag exiftool-rs extracts against Perl ExifTool 13.59, tag by tag. The only byte-level differences are a handful of Copyright fields (EXIF / PSP / RealAudio) where we decode a raw Latin-1 byte (©, ü) to readable UTF-8 rather than passing an invalid-UTF-8 byte through
  • 93 format readers covering all Perl ExifTool modules
  • 15 format writers: JPEG, TIFF, PNG, WebP, PSD, PDF, MP4, MKV, AVI, WAV, FLAC, MP3, OGG, CR2, HEIF/AVIF
  • 17 MakerNote manufacturers with deep sub-table decoders
  • Timed metadata extraction (-ee) for dashcams, action cams, drones
  • Optional GUI with 23 languages: 3311 tag descriptions and localized PrintConv values per language, matching ExifTool's -lang output across the corpus
  • 0 compiler warnings, unsafe limited to three OS calls, minimal dependencies

How it compares to ExifTool

exiftool-rs reimplements ExifTool in Rust: the tag tables and print conversions are generated from the Perl source, so the data matches, while the implementation is a compiled, dependency-free binary.

Analysis engine

ExifTool (Perl)exiftool-rs
LanguagePerl 5, interpretedRust, compiled
Size225 modules, ~327k lines162 files, ~192k lines (73k generated)
Tag tablesPerl hashes, loaded at runtimeStatic tables generated from the Perl source
PrintConv / ValueConvPerl code, eval-uated at runtimePorted Rust functions / match tables
Runtime dependenciesPerl + CPAN modulesNone (unsafe limited to three OS calls)

GUI

ExifTool (Perl)exiftool-rs
Bundled GUINone — CLI onlyYes — exiftool-rs-gui
Pseudo-official GUIExifToolGUI — third-party, Windows-only, drives the CLI underneathNative egui, single binary, cross-platform
Editingvia the third-party GUIDouble-click any writable tag, save back to file
Languages in the GUIn/a23, descriptions and values localized

Languages

ExifTool (Perl)exiftool-rs
Languages1823 (adds Arabic, Bengali, Hindi, Portuguese)
Tag descriptions
PrintConv values (OffArrêt)✅ — matches -lang on 192/195 corpus files
SourceLang/*.pmgenerated from Lang/*.pm

Supported Formats

Read (93 format modules)

CategoryFormats
ImagesJPEG, TIFF, PNG, WebP, PSD, BMP, GIF, HEIF/AVIF, ICO, PPM, PGF, BPG, XCF, MIFF, PICT, PCX, MNG, JXR, FLIF, Radiance HDR, OpenEXR, PSP, InDesign
RawCR2, CR3, CRW, CRM, NEF, DNG, ARW, ORF, RAF, RW2, PEF, SR2, SRW, X3F, IIQ, 3FR, ERF, MRW, Rawzor, KyoceraRaw
VideoMP4/MOV, AVI, MKV/WebM, MPEG, MTS/M2TS, WTV, DV, FLV, SWF, MXF, ASF/WMV, Real (RM/RAM)
AudioMP3, FLAC, WAV, OGG, Opus, AAC, AIFF, APE, MPC, WavPack, DSF, Audible
DocumentsPDF, RTF, HTML, PostScript, DjVu, OpenDocument (ODT/ODS/ODP/ODG), TNEF
FontsTrueType (TTF), OpenType (OTF), WOFF/WOFF2, AFM, PFA, PFB
ScientificDICOM, MRC, FITS, XISF, DPX, LIF (Leica)
ArchivesZIP, 7Z, RAR, GZIP, ISO, Torrent
OtherEXE/ELF/Mach-O, LNK, VCard, ICS, JSON, PLIST, PCAP, MIE, MOI, Lytro LFP, FLIR FPF, CaptureOne EIP, Palm PDB, FlashPix (OLE), iWork, Red R3D

Write (15 formats)

CategoryFormats
ImagesJPEG, TIFF, PNG, WebP, PSD
RawCR2, HEIF/AVIF
VideoMP4, MKV, AVI
AudioMP3, FLAC, WAV, OGG
DocumentsPDF

MakerNote Support (17 manufacturers)

ManufacturerSub-table Decoders
CanonCameraSettings, ShotInfo, AFInfo, ColorData (WB), CustomFunctions, VRD, CIFF, CTMD
NikonNikonCapture (D-Lighting, Crop, ColorBoost, UnsharpMask), ScanIFD, CaptureOffsets
SonySonyIDC, lens tables (400+ entries)
PentaxCameraSettings (K10D/K-5), AEInfo, LensInfo, FlashInfo, CameraInfo
OlympusEquipment, CameraSettings, FocusInfo, RawDevelopment
PanasonicRW2 sub-IFDs, AdvancedSceneMode composite
FujifilmRAF WB, PreviewImage
SamsungMakerNote IFD
SigmaMakerNote IFD, X3F raw
CasioType 1, Type 2
RicohMakerNote IFD
MinoltaMakerNote IFD
AppleMakerNote IFD
GoogleMakerNote IFD
FLIRThermal metadata, FPF
GEMakerNote IFD
GoProGPMF timed metadata

Timed Metadata (-ee)

SourceFormats
DashcamsfreeGPS (Novatek, Viofo, Azdome, Akaso, Vantrue, INNOVV, Nextbase), Kenwood (DRV-A510W)
Action camsGoPro GPMF (GPS, accelerometer, gyroscope), Insta360
DronesDJI telemetry, Yuneec/Autel (subtitle tracks)
AndroidGoogle CAMM (camera motion metadata, types 0-7)
GenericNMEA sentences (RMC, GGA), RVMI, Garmin

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);}

Features

FeatureDescription
guiEnable the graphical interface (exiftool-rs-gui binary)
win-iconEmbed Windows application icon in the binary (CLI builds only)

Note for library consumers: The win-icon feature should only be enabled when building standalone binaries. If you use exiftool-rs as a library dependency, do not enable win-icon — it would inject a Windows VERSION resource into your own binary and cause linker conflicts.

CLI Usage

# Install (CLI only)
cargo install exiftool-rs
# Install with GUI
cargo install exiftool-rs --features gui
# 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
# Extract embedded GPS from dashcam video
exiftool-rs -ee video.mp4

GUI

exiftool-rs includes an optional graphical interface built with egui.

# Install with GUI support
cargo install exiftool-rs --features gui
# Launch the GUI
exiftool-rs-gui
# Or with a specific language
exiftool-rs-gui -lang fr

Features:

  • Open files or folders, navigate with arrow keys
  • View all metadata grouped by category
  • Double-click any writable tag to edit it
  • Copy all metadata to clipboard
  • Save edits back to the file
  • 23 languages supported (CJK, Arabic, Hindi, Bengali fonts included via noto-fonts-dl)

Supported Languages (23)

CodeLanguageCodeLanguageCodeLanguage
enEnglishfrFrenchplPolish
arArabichiHindiptPortuguese
bnBengaliitItalianruRussian
csCzechjaJapaneseskSlovak
deGermankoKoreansvSwedish
en_caEnglish (CA)nlDutchtrTurkish
en_gbEnglish (UK)fiFinnishzhChinese (Simplified)
esSpanishzh_twChinese (Traditional)

Each language includes 3311 tag descriptions, localized PrintConv values (e.g. Orientation reads Horizontale (normale) under -lang fr), and all UI strings — natively translated where ExifTool 13.59 provides a translation, English otherwise. Value output matches ExifTool's -lang across the test corpus, except one cosmetic case (Mach-O CPUArchitecture, which ExifTool localizes for PE/ELF binaries but not Mach-O).

Platform Notes

OSIcon in binaryNotes
WindowsOpt-inIcon embedded in .exe via winres when win-icon feature is enabled
macOSNoRequires a .app bundle with .icns
LinuxNoELF binaries don't support embedded icons

CLI Options

OptionDescription
-sShort tag names
-s2Very short (tag names only)
-GShow group names
-nNumeric output (no print conversion)
-jJSON output
-csvCSV output
-XXML/RDF output
-bBinary output (thumbnails, etc.)
-eeExtract embedded data (GPS from dashcams, etc.)
-rRecursively scan directories
-ext EXTProcess only files with extension EXT
-TAGExtract specific tag(s)
-verShow version
-TAG=VALUEWrite tag
-TAG=Delete tag
-overwrite_originalOverwrite without backup
-stay_open TrueKeep running, read commands from stdin
-lang LANGSet language (GUI and tag descriptions)
-vVerbose output
-htmlDumpHTML hex dump of file structure
-validateValidate metadata
-diffShow differences between files
-argsPrint in ExifTool arg format
-phpPHP array output
-progressShow progress during processing
-scanForXMPScan file for XMP data

Testing

# Unit tests
cargo test# ISO-functional test against Perl ExifTool's 195 test files# No Perl required — reference files included in tests/expected/
./scripts/test_iso.sh
# 195/195 files produce identical tag names — names and values verified# against ExifTool 13.59; see tests/*_baseline.txt for the ratcheting contract

Building

git clone https://github.com/Le-Syl21/exiftool-rs
cd exiftool-rs
# CLI only
cargo build --release
# CLI + GUI
cargo build --release --features gui
# With Windows icon embedded in the .exe
cargo build --release --features win-icon

The gui feature is optional and not included by default. Without it, the GUI dependencies (egui, eframe, image, rfd, noto-fonts-dl) are not downloaded or compiled.

The win-icon feature embeds an icon into the Windows .exe via winres. It is disabled by default to avoid conflicts with frameworks like Tauri that manage their own Windows resources.

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.

About

port of exiftool 13.53 to rust crate by claude

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages