Transformers

Image Metadata

Reads a photo's EXIF — capture date, camera, lens, exposure, GPS — and merges it onto the payload. On-device, no network.

transformer.extract_image_metadata
TRANSFORMImage Metadata

At a glance

Takes
An image path on the payload
Emits
An exif object, four flat copies, success and hasExif
Good for
Renaming photos by capture date, sorting by camera, filtering by location

Set it up

Point Image at the upstream file — {{filePath}} from a Photo Added trigger, say. The EXIF lands in a nested exif object you reach with dot paths, and the photo's own keys stay on the payload so a later node can still act on it.

The inspector for Image Metadata: one field, the image to read.
The inspector for Image Metadata: one field, the image to read.

Configure

FieldDefaultWhat it does
Image{{filePath}}The image to read.

Output

Every key is available downstream as {{key}}. Keys the image doesn't carry are left out entirely, and a missing {{exif.*}} renders as an empty string.

KeyTypeValue
successBooleanfalse when the image was missing, unreadable, or not an image
hasExifBooleantrue when a camera wrote real EXIF beyond pixel dimensions — a screenshot is typically false
errorStringOn failure only — what went wrong
exif.dateTakenStringCapture date, ISO-8601: 2023-06-15T14:30:22
exif.dateTakenCompactStringCapture date as a filename-safe stamp: 20230615-143022
exif.cameraMakeStringManufacturer — Apple
exif.cameraModelStringModel — iPhone 15 Pro
exif.lensModelStringLens, when the camera recorded one
exif.isoNumberISO sensitivity
exif.apertureNumberf-number — 2.8
exif.focalLengthNumberMillimetres — 24
exif.shutterSpeedStringPhotographer-style exposure — 1/250
exif.pixelWidth · exif.pixelHeightNumberDimensions in pixels
exif.orientationNumberEXIF orientation, 1–8
exif.gpsLatitude · exif.gpsLongitudeNumberSigned decimal degrees; south and west are negative

The four most-templated values — dateTaken, dateTakenCompact, cameraModel, lensModel — are also copied to the top level, so {{dateTakenCompact}} works without the dot path.

Example: read a photo's capture date

Input picks a photo. Image Metadata reads its EXIF. Template builds a caption from {{exif.dateTakenCompact}} and {{exif.cameraModel}}, and Log records it.

Four nodes: pick a photo, read its EXIF, build a caption, log it.
Four nodes: pick a photo, read its EXIF, build a caption, log it.

Paste this into the Flow Builder to get the same flow:

Let me pick a photo with an Input trigger, read its EXIF metadata, build a caption from the capture date and camera model, and log it.

Good to know

A failure is a payload, not a stopped run. A missing or non-image file comes back as success: false with an error, so branch on it with a Condition.

Dates are the photo's own wall clock. EXIF stores a zone-less local time, and it is parsed and formatted in UTC so the same string round-trips on every Mac. It is not converted to your time zone.

GPS arrives already signed. EXIF stores unsigned degrees plus an N/S/E/W letter; the letter is folded into the sign here, so {{exif.gpsLatitude}} is ready for a comparison.