๐ Exif Data
Compatibilityโ
| Exif Field | Representation | Read | Write | Explanation |
|---|---|---|---|---|
| Rating | Favorites | โ๏ธ | โ๏ธ | Settable via "Minimum image rating to interpret as favorite". Written back when you change a rating or favorite a photo, but only if "Write edits to files" is enabled. Favoriting a selection writes the ratings in the background, so the files can lag the library by a moment. A scan only reads the rating and never writes it back. Not released yet: up to 1.3.0, a scan wrote a rating it found in the file back to disk, which in sidecar mode created an .xmp holding just that rating; such sidecars are harmless unless the rating is later changed in the original by another app. |
| ImageHeight | Height | โ๏ธ | โ | Used for aspect ratio calculation |
| ImageWidth | Width | โ๏ธ | โ | Used for aspect ratio calculation |
| Composite:Rotation | Width and height | โ๏ธ | โ | A video recorded upright on a phone is stored landscape with a rotation of 90 or 270 degrees; its width and height are then swapped, so Info shows the size it plays at. Not released yet; the update fixes the size of videos scanned before. |
| EXIF:DateTimeOriginal | Timestamp | โ๏ธ | โ | Parsing rules settable in settings. Dates you edit are written back to XMP:DateCreated, never to an EXIF date tag. |
| XMP:DateCreated | Timestamp | โ๏ธ | โ๏ธ | The only tag LibrePhotos writes dates to. It is used instead of an EXIF date tag because EXIF tags cannot be written into an XMP sidecar, and because writing it leaves the camera's original EXIF:DateTimeOriginal untouched. Highest-priority date parsing rule. |
| EXIF:ModifyDate | Timestamp | โ๏ธ | โ | Read-only. Parsing rules settable in settings; dates you edit are written back to XMP:DateCreated. |
| QuickTime:CreateDate | Timestamp | โ๏ธ | โ | Parsing rules settable in settings. Dates you edit are written back to XMP:DateCreated, never to an EXIF date tag. |
| QuickTime:CreationDate | Timestamp | โ๏ธ | โ | The local time a phone (iPhone, many Android phones) recorded a video at, with its UTC offset. Used as is by the date rule "Local time from the video's QuickTime:CreationDate tag (phones)", ranked above the UTC QuickTime:CreateDate. Not released yet. |
| Matroska:DateTimeOriginal | Timestamp | โ๏ธ | โ | The creation date of MKV and WebM files, in UTC. Converted to local time with the time zone of the video's position, or else your default time zone. Not released yet; before, only a date in the file name could date these files. |
| QuickTime:Duration | Video length | โ๏ธ | โ | Used for video length on video tiles |
| Matroska:Duration | Video length | โ๏ธ | โ | Video length of MKV and WebM files, which carry no QuickTime:Duration. Since 1.3.0; videos scanned by an older version get it with a Rescan from the Library page. |
| Composite:GPSLatitude | GPS_lat | โ๏ธ | โ๏ธ | Used for photo label on map. A location you set or remove is written back when "Write edits to files" is enabled; see What LibrePhotos writes for the tags. Not released yet. |
| Composite:GPSLongitude | GPS_lon | โ๏ธ | โ๏ธ | Used for photo label on map. Written back together with the latitude. |
| Composite:GPSDateTime | Timestamp | โ๏ธ | โ | Used by the GPS-based timestamp parsing rules. |
| EXIF:Model | Camera Model | โ๏ธ | โ | Camera model in Info |
| QuickTime:Make, QuickTime:Model | Camera | โ๏ธ | โ | Camera maker and model of a video, which carries no EXIF:Make or EXIF:Model. Not released yet; videos scanned before get them with a Rescan from the Library page. |
| EXIF:LensModel | Lens | โ๏ธ | โ | Lens in Info |
| EXIF:Make, EXIF:LensMake | Camera and lens maker | โ๏ธ | โ | Shown in front of the camera model and lens in Info ("Fujifilm X-T5"), unless the model already starts with it ("NIKON D850", not "NIKON CORPORATION NIKON D850"). Corporate words at the end of a maker's name are left out there ("OLYMPUS IMAGING CORP." shows as "OLYMPUS"). Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| EXIF:SerialNumber | Camera serial number | โ๏ธ | โ | Stored in the photo's metadata (/api/photos/{id}/metadata/), not shown in Info and not sent with every photo. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| EXIF:ExposureCompensation, EXIF:Flash, EXIF:MeteringMode, EXIF:WhiteBalance | Exposure compensation, flash fired, metering mode, white balance | โ๏ธ | โ | Stored in the photo's metadata; metering mode and white balance under the names ExifTool prints (Multi-segment, Auto, ...). Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| EXIF:ColorSpace, File:BitsPerSample | Colour space, bit depth | โ๏ธ | โ | Stored in the photo's metadata. Bit depth is read from JPEG files only. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| Composite:GPSAltitude | Altitude | โ๏ธ | โ | Altitude in metres, negative below sea level, stored in the photo's metadata. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| EXIF:SubjectDistance, EXIF:DigitalZoomRatio | Subject distance, digital zoom | โ๏ธ | โ | Shown under "Show more" in Info. 0, which EXIF uses for "unknown" and "not used", is left empty. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| File:FileSize | File Size | โ๏ธ | โ | File Size in Info |
| EXIF:FNumber | F Stop | โ๏ธ | โ | F Stop in Info |
| EXIF:ExposureTime | Shutter Speed | โ๏ธ | โ | Shown as Shutter Speed in Info the way ExifTool prints it: 1/4000 up to a quarter second, then seconds (0.3 s, 2.5 s, 30 s). Not released yet: up to 1.3.0, anything faster than about 1/2000 s was stored as 0, 1/1250 to 1/2000 s as 1/1000, and long exposures as fractions such as 5/2. python manage.py refresh_exposure_time reads just the exposure time of those photos again; a Rescan from the Library page also fixes them. |
| EXIF:ISOSpeedRatings | ISO | โ๏ธ | โ | ISO in Info |
| EXIF:FocalLength | Focal Length | โ๏ธ | โ | Focal Length in Info |
| EXIF:FocalLengthIn35mmFilm | Focal Length in 35mm | โ๏ธ | โ | Focal Length in 35mm Film in Info |
| XMP:RegionInfo | Faces | โ๏ธ | โ๏ธ | Faces and people are read from XMP:RegionInfo. Writing is opt-in via the "Write face tags to image files" setting (off by default); when enabled and "Write edits to files" is set to a sidecar or the media file, labelling a face writes MWG regions as XMP-mwg-rs:RegionInfo (with AppliedToDimensions and normalized areas) to the image file or XMP sidecar. Only manually labelled people are given a name; auto-detected faces are written as unnamed regions. The areas are in the coordinates of the stored image, as the standard asks, so on a rotated photo (most phone portraits, and photos you turned in LibrePhotos) other apps show them on the faces. Not released yet: earlier versions wrote the regions of rotated photos in the wrong place, and read the regions of photos turned in LibrePhotos onto the wrong spot; python manage.py save_metadata --types face_tags rewrites them. |
| XMP:Subject | Keywords / People | โ๏ธ | โ๏ธ | Read and merged with IPTC:Keywords, XMP-iptcExt:PersonInImage and XMP-lr:HierarchicalSubject into the photo's keywords. Written alongside face regions: the names of manually labelled people are added as keywords for Lightroom compatibility. The photo's other keywords stay, and relabelling a face removes the previous name. A new XMP sidecar starts from the photo's own keywords (XMP:Subject and IPTC:Keywords), so they are not hidden behind it. Not released yet: earlier versions replaced the keywords with the names. Your tags are written here too when "Write edits to files" is enabled; see What LibrePhotos writes. Not released yet. |
| IPTC:Keywords | Keywords | โ๏ธ | โ๏ธ | Merged with XMP:Subject into the photo's keywords. With "Save to media file", your tag edits reach it too, but only in a file that already has IPTC data. Not released yet. |
| XMP-iptcExt:PersonInImage | Keywords | โ๏ธ | โ | Names of the people shown (without face regions), added to the photo's keywords and so its tags. Not linked to people in LibrePhotos, which come from faces. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. Never written: removing such a tag leaves the name here. |
| XMP-lr:HierarchicalSubject | Keywords | โ๏ธ | โ | Hierarchical keywords as written by Lightroom, digiKam and darktable. The last level of each path becomes a keyword: Places|USA|San Francisco adds San Francisco. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. Never written: removing such a tag leaves the path here. |
| XMP:Description | Caption | โ๏ธ | โ๏ธ | The photo's description becomes its caption: the default-language entry first, else any language entry. A caption you typed is never replaced, and one you cleared stays cleared. A caption you type is written back as the description when "Write edits to files" is enabled. Not released yet. |
| IPTC:Caption-Abstract | Caption | โ๏ธ | โ | Caption fallback when the file has no XMP description (older Photoshop and Lightroom, Picasa, newsroom tools). Not released yet; photos scanned by an older version get it with a Rescan from the Library page. With "Save to media file", a caption you type replaces it, but only in a file that already has an IPTC block. |
| EXIF:ImageDescription | Caption | โ๏ธ | โ | Last caption fallback. Placeholders cameras write there, such as OLYMPUS DIGITAL CAMERA or SONY DSC, and a description that only repeats the camera model are skipped. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. With "Save to media file", a caption you type replaces it. |
| XMP:Title, XMP:Headline, IPTC:ObjectName | Title | โ๏ธ | โ | The title, from the first of these tags that has one. A title you edit is kept on later scans until you restore the photo from its file. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| XMP:Creator, IPTC:By-line, EXIF:Artist | Creator | โ๏ธ | โ | The creator, from the first of these tags that has one (the first name when there are several). An edit of yours is kept on later scans. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| XMP:Rights, IPTC:CopyrightNotice, EXIF:Copyright | Copyright | โ๏ธ | โ | The copyright notice, from the first of these tags that has one. An edit of yours is kept on later scans. Not released yet; photos scanned by an older version get it with a Rescan from the Library page. |
| EXIF:Orientation | Orientation | โ๏ธ | โ๏ธ | Read to transform face-region coordinates, and to store the size a photo is shown at: an orientation of 5-8 turns the photo a quarter, so its width and height are swapped, as they are when you rotate it a quarter yourself. Not released yet; the update fixes the size of photos scanned before. Written back (composed with your rotation) when you rotate a photo, but only if "Write edits to files" is enabled: into the original for JPEG, PNG, TIFF and WebP, as XMP-tiff:Orientation into the sidecar for every format (for HEIC and AVIF composed with the file's irot/imir, which is what the photo is shown under). HEIC, AVIF and RAW originals are not rewritten. LibrePhotos does not read the sidecar's orientation back. Not released yet: earlier versions wrote no orientation into sidecars and a wrong one into HEIC, AVIF and RAW originals. |
| EXIF:SubSecTimeOriginal | Sub-second time | โ๏ธ | โ | Read on every metadata extract; used for burst/sequence detection. |
| EXIF:ImageNumber | Image sequence | โ๏ธ | โ | Read on every metadata extract; used for burst/sequence detection. |
XMP sidecarsโ
A sidecar (photo.xmp or photo.jpg.xmp next to photo.jpg) is read together with the
photo, and a value found in the sidecar wins over the one embedded in the file. Apps that
leave the original untouched (geotaggers, digiKam, darktable, Lightroom) store EXIF
properties in the sidecar under their XMP names, and LibrePhotos reads these there too:
| Field | Read from the sidecar as |
|---|---|
EXIF:DateTimeOriginal | exif:DateTimeOriginal |
Composite:GPSLatitude, Composite:GPSLongitude | exif:GPSLatitude, exif:GPSLongitude |
Composite:GPSDateTime | exif:GPSTimeStamp |
EXIF:Model | tiff:Model |
EXIF:LensModel | exifEX:LensModel |
EXIF:FNumber, EXIF:ExposureTime, EXIF:ISO, EXIF:FocalLength, EXIF:FocalLengthIn35mmFormat | exif:FNumber, exif:ExposureTime, exif:ISOSpeedRatings, exif:FocalLength, exif:FocalLengthIn35mmFilm |
EXIF:Make, EXIF:LensMake | tiff:Make, exifEX:LensMake (not released yet) |
EXIF:ExposureCompensation, EXIF:MeteringMode, EXIF:WhiteBalance, EXIF:SubjectDistance, EXIF:DigitalZoomRatio | exif:ExposureBiasValue, exif:MeteringMode, exif:WhiteBalance, exif:SubjectDistance, exif:DigitalZoomRatio (not released yet) |
Not released yet: before this, only the XMP-native fields (rating, keywords, description,
XMP:DateCreated, face regions) were taken from a sidecar. Photos already in your library pick
up a sidecar's date and camera with a Rescan from the Library page; a position in the
sidecar of a photo that is already in the library does not reach the map yet (#2264). A sidecar's
modify date and orientation are never read: they describe the last edit, not the photo.
Rulesโ
Some tags are only read when a matching rule is active. The burst/stacking detection
rules read MakerNotes:BurstMode, MakerNotes:ContinuousDrive and
MakerNotes:SequenceNumber only when the corresponding stack-detection rule is enabled
in your settings.
To back-fill an existing library with face tags, run
python manage.py save_metadata --types face_tags. Each photo is written where its owner's
"Write edits to files" setting says (XMP sidecar or media file), and photos of users
who have it Off are skipped. --sidecar or --media-file overrides the setting for the one
user named with --user.
What LibrePhotos writesโ
With Settings โ Metadata Options โ Write edits to files set to Save to sidecar or Save to media file, these edits are also written to the photo's .xmp sidecar or into the photo file
itself. With Off, the default, nothing is written. Not released yet: up to 1.3.0, the setting
was called "Synchronize metadata to disk".
| Edit | Written | Tag |
|---|---|---|
| Rating and favorite | yes | Rating |
| Date and time | yes | XMP:DateCreated |
| Rotation | yes, except into HEIC, AVIF and RAW originals | XMP-tiff:Orientation in the sidecar, EXIF:Orientation in the file |
| Caption | yes (not released yet) | XMP-dc:Description in the sidecar; in the file XMP-dc:Description and EXIF:ImageDescription, and IPTC:Caption-Abstract if the file already has IPTC data |
| Location | yes (not released yet) | XMP-exif:GPSLatitude/GPSLongitude in the sidecar; in an image file GPS:GPSLatitude/GPSLongitude with their N/S and E/W references; in an MP4 or MOV Keys:GPSCoordinates |
| Face names and areas | only with "Write face tags to image files" | XMP-mwg-rs:RegionInfo, names added to XMP:Subject |
| Tags | yes (not released yet) | XMP-dc:Subject in the sidecar; in the file XMP-dc:Subject, and IPTC:Keywords if the file already has IPTC data |
A caption keeps its line breaks. Clearing the caption removes the description, and removing a location removes the position tags. Setting a location in a photo file also removes the file's old altitude, which belonged to the old position. The place name (city, country) is never written: it is looked up from the position again. A generated caption is never written, only one you type.
Tags are written as keywords, one change at a time: adding a tag adds that keyword (once, never
twice), removing it removes that keyword, and the file's other keywords stay. Renaming, merging or
deleting a tag on the Albums page changes the keyword in the files of every photo that carries
the tag, in one background job. The names of people that the face write-back adds stay, even when
you remove a tag of the same name, and XMP-iptcExt:PersonInImage and
XMP-lr:HierarchicalSubject are never changed. A tag that came from one of those is not written
as a keyword unless you add it yourself. A new sidecar starts from the photo's own keywords, so
it does not hide them.
With tags written to files, a rescan only turns keywords into tags that the file did not have
before, such as one another app added. A tag you removed stays removed, even where the file still
carries the keyword (a people name or keyword path, or an IPTC:Keywords entry the sidecar cannot
remove). With Off, a rescan adds every keyword of the file back as a tag, as before.
In the sidecar mode a removal only reaches the sidecar: a description, position or keyword stored in the photo file itself stays there, and an app that reads the file (or a new import into LibrePhotos) sees it again. Removing the last keyword leaves the sidecar without a keyword list, so the photo file's keywords show again. Inside LibrePhotos the removal stays.
The date editor, the caption and tags editors and the Pick location dialog say the same in a line under the editor, with a link to the setting.
XMP sidecarsโ
LibrePhotos reads both sidecar naming conventions next to a photo IMG_2.jpg, in lower or
upper case: IMG_2.xmp (Lightroom, older LibrePhotos versions) and IMG_2.jpg.xmp
(digiKam, darktable, Immich). A value in a sidecar overrides the same tag in the photo, and
when both sidecars exist, IMG_2.xmp wins.
With "Write edits to files" set to the sidecar, an edit is written to the sidecar
that already exists, so a digiKam or darktable sidecar is updated in place and keeps its other
tags. When both exist, the edit goes to IMG_2.xmp, the one that is read. When there is none,
LibrePhotos creates IMG_2.jpg.xmp, which other apps also read and which cannot be mistaken
for the sidecar of a RAW file next to the JPEG (IMG_2.CR2).
Not released yet: up to 1.3.0, LibrePhotos always wrote to IMG_2.xmp, creating it next to
an existing IMG_2.jpg.xmp. A photo that already has both keeps both; LibrePhotos reads and
writes IMG_2.xmp, and the other app keeps its own file.
Writes that failโ
A write ExifTool cannot make, for example into a read-only library, a damaged file or a format
that cannot hold the tag, never undoes your edit: the rating, date, caption, location, face label
or rotation stays in LibrePhotos. The backend log names the photo and ExifTool's reason. Labelling a face, drawing
one and rotating a photo also return the reason as write_error in the API response, and
POST /api/savemetadata and manage.py save_metadata count the photos they could not write
as errors.
In the web app, a face label, a drawn face or a rotation that did not reach the file shows an orange Not written to the file notice next to the usual confirmation: "Saved in LibrePhotos, but not written to the file", followed by the reason. It stays until you close it. Changing a date, a rating, a caption or a location writes the file after the edit is saved, so a failure there is only in the backend log.
Not released yet: up to 1.3.0, a failed write looked like a success and was not logged, and the web app showed no notice.