First release.
A mostly-pure-Python library to read, write, and synchronise descriptive image metadata — EXIF, IPTC-IIM, and XMP — across JPEG, PNG, and TIFF. Focuses on descriptive / rights / location fields (caption, creator, copyright, keywords, location, dates, rating), not camera-technical tags. Permissive dependencies only (Pillow, piexif, defusedxml) — no native exiv2/libheif, no ExifTool.
Features
- Unified model — read each logical field from wherever it lives (XMP > IPTC > EXIF precedence) and write it back to every standard that carries it.
- Read + write — JPEG and PNG embedded read/write with round-trip preservation of pixels and unmodelled metadata; TIFF read, plus TIFF write via XMP sidecar.
- Sync — directional copy between standards (e.g. populate IPTC/XMP from a camera's EXIF).
- XMP export — as a string or
.xmpsidecar (both naming conventions), plus sidecar reading and custom-namespace get/set. - Validation — user-defined
RequiredFieldsschemas (per-field or per-standard). - Strip (privacy) and diff_standards (cross-standard out-of-sync report).
Safety
Parses untrusted image bytes defensively: XMP via defusedxml (blocks XXE and billion-laughs), bounds-checked marker/chunk/IIM parsing, and a clean MetadataError on any malformed input.
Tested on Python 3.10–3.14.