You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 KiB

EXIV2(1)

NAME

exiv2 - Image metadata manipulation tool

SYNOPSIS

exiv2 [ options ] [ action ] file ...

DESCRIPTION

exiv2 is a program to read and write image metadata, including Exif, IPTC, XMP, image comments, ICC Profile, thumbnails, image previews and many vendor makernote tags. The program optionally converts between Exif tags, IPTC datasets and XMP properties as recommended by the Exif Standard, the IPTC Standard, the XMP specification and the Metadata Working Group guidelines.

TABLE OF CONTENTS

  1. SYNOPSIS
  2. DESCRIPTION
  3. FILE TYPES
  4. ACTIONS
  5. COMMAND SUMMARY
  6. OPTIONS
  7. 'MODIFY' COMMANDS
    1. Quotations with 'modify' commands
    2. 'Modify' command format
    3. 'Modify' examples
    4. 'Modify' command file
  8. EXIV2 GROUPS, TYPES AND VALUES
    1. Exiv2 tags
    2. Exif/IPTC/XMP types
    3. Exiv2 key syntax
    4. Multiple elements
    5. Duplicate Exif tags
    6. Date/Time formats
    7. Exif 'Comment' values
    8. XMP namespaces
    9. XMP LangAlt values
    10. XMP structs
  9. CONFIGURATION FILE
  10. EXAMPLES
  11. ENVIRONMENT
  12. NOTES
  13. BUGS
  14. COPYRIGHT
  15. SEE ALSO
  16. AUTHORS

FILE TYPES

The following image formats and metadata categories are supported:

Type Exif IPTC XMP Image Comments ICC Profile Thumbnail
ARW Read Read Read - - Read
AVIF Read Read Read - - Read
BMP - - - - - -
CR2 Read/Write Read/Write Read/Write - Read/Write Read/Write
CR3 Read Read Read - Read Read
CRW Read/Write - - Read/Write - Read/Write
DNG Read/Write Read/Write Read/Write - Read/Write Read/Write
EPS - - Read/Write - -
EXV Read/Write Read/Write Read/Write Read/Write Read/Write Read/Write
GIF - - - - - -
HEIC Read Read Read - - Read
HEIF Read Read Read - - Read
JP2 Read/Write Read/Write Read/Write - Read/Write Read/Write
JPEG Read/Write Read/Write Read/Write Read/Write Read/Write Read/Write
MRW Read Read Read - - Read
NEF Read/Write Read/Write Read/Write - Read/Write Read/Write
ORF Read/Write Read/Write Read/Write - - Read/Write
PEF Read/Write Read/Write Read/Write - Read/Write Read/Write
PGF Read/Write Read/Write Read/Write Read/Write Read/Write -
PNG - Read/Write Read/Write - Read/Write Read/Write
PSD Read/Write Read/Write Read/Write - - Read/Write
RAF Read Read Read - - Read
RW2 Read Read Read - - Read
SR2 Read Read Read - - Read
SRW Read/Write Read/Write Read/Write - - Read/Write
TGA - - - - - -
TIFF Read/Write Read/Write Read/Write - Read/Write Read/Write
WEBP Read/Write - Read/Write - Read/Write Read/Write
XMP - - Read/Write - - -
  • Support for GIF, TGA and BMP images is minimal: the image format is recognized, a MIME type assigned to it and the height and width of the image are determined.

  • Reading other TIFF-like RAW image formats, which are not listed in the table, may also work.

  • The thumbnail, if available, is included in the list of image previews.

TOC

ACTIONS

The action argument is only required if it is not clear from the options which action is implied.

pr | print

Print image metadata. This is the default action, i.e. the command exiv2 image.jpg will print a summary of the image Exif metadata.

ex | extract

Extract metadata to *.exv, XMP sidecar (*.xmp), preview image, thumbnail or ICC profile file. Modification commands can be applied on-the-fly.

in | insert

Insert metadata from corresponding *.exv, XMP sidecar (*.xmp), thumbnail or ICC profile files. Use option --suffix suf to change the suffix of the input files. Since files of any supported format can be used as input files, this command can be used to copy the metadata between files of different formats. Modification commands can be applied on-the-fly.

rm | delete

Delete image metadata from the files.

ad | adjust

Adjust Exif timestamps by the given time. Requires at least one of the options --adjust time, --years +-n, --months +-n or --days +-n. See TZ environment variable.

mo | modify

Apply commands to modify (add, set, delete) the Exif, IPTC and XMP metadata of image files. Requires option --comment txt, --modify cmdfile or --Modify cmd.

mv | rename

Rename files and/or set file timestamps according to the Exif create timestamp. Uses the value of tag Exif.Photo.DateTimeOriginal or, if not present, Exif.Image.DateTime to determine the timestamp. The filename format can be set with --rename fmt, timestamp options are --timestamp and --Timestamp. See TZ environment variable.

fi | fixiso

Copy the ISO setting from one of the proprietary Nikon or Canon makernote ISO tags to the regular Exif ISO tag, Exif.Photo.ISOSpeedRatings. Does not overwrite an existing Exif ISO tag.

fc | fixcom

Fix the character encoding of Exif Unicode user comments. Decodes the comment using the auto-detected or specified character encoding and writes it back in UCS-2. Use option --encode enc to specify the current encoding of the comment if necessary.

TOC

COMMAND SUMMARY

exiv2 [ option [ arg ] ]+ [ action ] file ...

Where file contains image metadata, optionally specified using a URL (http, https, ftp, sftp, data and file supported) or a wildcard pattern (e.g., *.jpg)

Option Long option Description
-a time --adjust time Automatically modify metadata time stamps. For the adjust action [...]
-b --binary Obsolete and should not be used. Reserved for use with the test suite
-c txt --comment txt JPEG comment string to set in the image. For the modify action [...]
-d tgt1 --delete tgt1 Delete target(s) for the delete action [...]
-D +-n --days +-n Automated adjustment of the days in metadata dates [...]
-e tgt3 --extract tgt3 Extract target(s) for the extract action [...]
-f --force Do not prompt before overwriting existing files. For the rename and extract actions [...]
-F --Force Do not prompt before renaming files. For the rename and extract actions [...]
-g str --grep str Only output where str matches in output text [...]
-h --help Display help and exit [...]
-i tgt2 --insert tgt2 Insert target(s) for the insert action [...]
-k --keep Preserve file timestamps when updating files [...]
-K key --key key Report a key. Similar to --grep str, however key must match exactly [...]
-l dir --location dir Location (directory) for files to be inserted or extracted [...]
-m cmdfile --modify cmdfile Read commands from a file. For the modify action [...]
-M cmd --Modify cmd Modify the metadata with the command. For the modify action [...]
-n enc --encode enc Charset to decode Exif Unicode user comments [...]
-O +-n --months +-n Automated adjustment of the months in metadata dates [...]
-p mod --print mod Print report (common reports) [...]
-P flg --Print flg Print report (fine grained control) [...]
-q --quiet Silence warnings and error messages [...]
-Q lvl --log lvl Set the log-level to 'd'(ebug), 'i'(nfo), 'w'(arning), 'e'(rror) or 'm'(ute) [...]
-r fmt --rename fmt Filename format for the rename action [...]
-S suf --suffix suf Use suffix for source files when using the insert command [...]
-t --timestamp Set the file timestamp from Exif metadata. For the rename action [...]
-T --Timestamp Only set the file timestamp from Exif metadata. For the rename action [...]
-u --unknown Show unknown tags [...]
-v --verbose Verbose [...]
-V --version Show the program version and exit [...]
-Y +-n --years +-n Automated adjustment of the years in metadata dates [...]

The flags for those options are:

Parameter Description
action pr | ex | in | rm | ad | mo | mv | fi | fc
(print, extract, insert, delete, adjust, modify, rename, fixiso, fixcom)
cmd (set | add) key [[type] value] | del key [type] | reg prefix namespace
(see 'Modify' command format)
enc Values defined in iconv_open(3) (e.g., UTF-8)
flg E | I | X | x | g | k | l | n | y | c | s | v | t | h
(Exif, IPTC, XMP, num, grp, key, label, name, type, count, size, vanilla, translated, hex)
fmt Default format: %Y%m%d_%H%M%S
key See Exiv2 key syntax)
lvl d | i | w | e
(debug, info, warning, error)
mod s | a | e | t | v | h | i | x | c | p | C | R | S | X
(summary, all, Exif, translated, vanilla, hex, IPTC, XMP, comment, preview, ICC Profile, Recursive Structure, Simple Structure, raw XMP)
suf '.' then the file's extension (e.g., '.txt')
time [ +|-]HH[:MM[:SS[.mmm]]]
(Default is + when +/- are missing)
tgt1 a | c | e | i | I | t | x | C | -
(all, comment, Exif, IPTC, IPTC all, thumbnail, XMP, ICC Profile, stdin/out)
tgt2 a | c | e | i | t | x | C | X | XX | -
(all, comment, Exif, IPTC, thumbnail, XMP, ICC Profile, SideCar, Raw XMP, stdin/out)
tgt3 a | e | i | p | t | x | C | X | XX | -
(all, Exif, IPTC, preview, thumbnail, XMP, ICC Profile, SideCar, Raw XMP, stdin/out)
type An Exif, IPTC or XMP tag type (e.g., xmpText). See Exif/IPTC/XMP types
+-n The amount to change in the date (e.g., -3). Default is + when +/- are missing

TOC

OPTIONS

-h, --help

Display help and exit.

-V, --version

Show the program version and exit.

When --version is combined with --verbose, build information is printed to standard output along with a list of shared libraries which have been loaded into memory. Verbose version is supported on Windows (MSVC, Cygwin and MinGW builds), macOS and Linux and is provided for test and debugging. The library name and version number are always printed, even if output is filtered with --grep str.

-v, --verbose

Be verbose during the program run.

-q, --quiet

Silence warnings and error messages during the program run. Note that options --quiet and --verbose can be used at the same time.

-Q lvl, --log lvl

Set the log-level to 'd'(ebug), 'i'(nfo), 'w'(arning), 'e'(rror) or 'm'(ute), with the lvl chosen including those below it ('d' <- 'i' <- 'w' <- 'e'). The default log-level is 'w'. --log m is equivalent to --quiet. All log messages are written to standard error.

-u, --unknown

Show unknown tags. Default is to suppress tags which don't have a name (e.g., Exif.SonyMisc3c.0x022b).

-g str, --grep str

When printing tags, display only those where str is found in the key (see Exiv2 key syntax). When --grep str is used with --verbose --version, lines are included where str matches in the variable or value.

Multiple --grep str options can be used to output additional data:

$ exiv2 --verbose --version --grep webready --grep time
exiv2 1.0.0.9
time=11:01:53
enable_webready=1
xmlns=mediapro:http://ns.iview-multimedia.com/mediapro/1.0/

When the --print mod and --Print flgs options are not specified, the default is --print a:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --grep Date Stonehenge.jpg
Exif.Image.DateTime                          Ascii      20  2015:07:16 20:25:28
Exif.Photo.DateTimeOriginal                  Ascii      20  2015:07:16 15:38:54
Exif.Photo.DateTimeDigitized                 Ascii      20  2015:07:16 15:38:54
Exif.NikonWt.DateDisplayFormat               Byte        1  Y/M/D
Exif.GPSInfo.GPSDateStamp                    Ascii      11  2015:07:16
Xmp.xmp.ModifyDate                           XmpText    25  2015-07-16T20:25:28+01:00

You may use --print mod or --Print flgs to further filter output (--print s is ignored):

$ exiv2 --print x --grep Date Stonehenge.jpg
Xmp.xmp.ModifyDate                           XmpText    25  2015-07-16T20:25:28+01:00

str can contain an optional /i modifier at the end, to indicate case insensitivity:

$ exiv2 --print px --grep date/i Stonehenge.jpg
Xmp.xmp.ModifyDate                           XmpText    25  2015-07-16T20:25:28+01:00

-K key, --key key

Only reports tags for a given key, which must match the key exactly (See Exiv2 key syntax).

Multiple --key key options can be used to report more than a single key:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --key Exif.Photo.DateTimeDigitized --key Exif.Photo.DateTimeOriginal Stonehenge.jpg
Exif.Photo.DateTimeOriginal                  Ascii      20  2015:07:16 15:38:54
Exif.Photo.DateTimeDigitized                 Ascii      20  2015:07:16 15:38:54

-n enc, --encode enc

Charset to use when decoding Exif Unicode user comments, where enc is a name understood by iconv_open(3) (e.g., 'UTF-8').

-k, --keep

Preserve file timestamps when updating files. Can be used with all options which update files and is ignored by read-only options.

-t, --timestamp

Set the file timestamp according to the Exif create timestamp in addition to renaming the file (overrides --keep). This option is only used with the rename action. See TZ environment variable.

-T, --Timestamp

Only set the file timestamp according to the Exif create timestamp, do not rename the file (overrides --keep). This option is only used with the rename action. See TZ environment variable.

-f, --force or -F, --Force

These options are used by the rename and extract actions to determine the file overwrite policy. The options override the default behavior, which is to prompt the user if the filename already exists. These options are usually combined with --verbose, to provide additional status output.

The rename action will overwrite files when --force is used. Instead, if --Force is used and the file already exists, the new filename is appended with '_1' ('_2', ...) to prevent data loss.

The extract action will overwrite files when either --force or --Force is used.

For example, renaming a file using --Force, where the same filename has already been renamed:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --verbose --Force rename Stonehenge.jpg
File 1/1: Stonehenge.jpg
Renaming file to ./20150716_153854.jpg

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --verbose --Force rename Stonehenge.jpg
File 1/1: Stonehenge.jpg
Renaming file to ./20150716_153854_1.jpg

-r fmt, --rename fmt

Filename format for the rename action (See TZ environment variable). The fmt string follows the definitions in strftime(3), using Exif.Photo.DateTimeOriginal or Exif.Image.DateTime as the reference date and time. In addition, the following special character sequences are also provided:

Variable Description
:basename: Original filename without extension
:dirname: Name of the directory holding the original file
:parentname: Name of parent directory

The default fmt is %Y%m%d_%H%M%S

For example, renaming a file when fmt is made up of the basename, day, short month and long year:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --verbose --rename ':basename:_%d_%b_%Y' Stonehenge.jpg
File 1/1: Stonehenge.jpg
Renaming file to ./Stonehenge_16_Jul_2015.jpg

If the filename to rename to already exists and --Force and --force are not used, the user is prompted for an action.

Option Description
[O]verwrite Rename the file, overriding the existing one
[r]ename Rename the file, but append '_1' ('_2', ...) to the new filename
[s]kip : Cancel renaming this file

For example, when renaming a second Stonehenge.jpg file:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --verbose --rename ':basename:_%d_%b_%Y' Stonehenge.jpg
File 1/1: Stonehenge.jpg
exiv2.exe: File `./Stonehenge_16_Jul_2015.jpg' exists. [O]verwrite, [r]ename or [s]kip? r
Renaming file to ./Stonehenge_16_Jul_2015_1.jpg

-a time, --adjust time

Time adjustment, where time is in the format [-]HH[:MM[:SS]]. This option is only used with the adjust action. See TZ environment variable.

Examples of time are:

Time Description
+1 Adds one hour
1:01 Adds one hour and one minute
-0:00:30 Subtracts 30 seconds

-Y +-n, --years +-n

Time adjustment by a positive or negative number of years, for the adjust action. See TZ environment variable.

-O +-n, --months +-n

Time adjustment by a positive or negative number of months, for the adjust action. See TZ environment variable.

-D +-n, --days +-n

Time adjustment by a positive or negative number of days, for the adjust action. See TZ environment variable.

-p mod, --print mod

Print mode for the print action (see DESCRIPTION, for metadata support in a file type). Possible modes are:

Option Description
s A summary of the Exif metadata (the default for the print action)
a Exif, IPTC and XMP metadata (shortcut for --Print kyct)
e Exif metadata (shortcut for --Print Ekycv)
t Interpreted (translated) Exif tag values (shortcut for --Print Ekyct)
v Plain (untranslated) Exif tag values (shortcut for --Print Exgnycv)
h Hex dump of the Exif data (shortcut for --Print Exgnycsh)
i IPTC datasets (shortcut for --Print Ikyct)
x XMP properties (shortcut for --Print Xkyct)
c JPEG comment
p List available image previews, sorted by size in pixels (e.g., see --extract tgt3)
C Image ICC Profile
R Print image structure recursively (only for the 'debug' build with jpg, png, tiff, webp, cr2 and jp2 types)
S Image structure information (jpg, png, tiff, webp, cr2 and jp2 types only)
X "raw" XMP

--print mod can be combined with --grep str or --key key to further filter the output.

For the order of the columns in the output, see --Print flgs.

-P flgs, -Print flgs

Print flags allows fine control of the tag list for the print action (see DESCRIPTION, for metadata support in a file type). The option allows control of the type of metadata as well as data columns included in the print output. Valid flags are:

Option Description
E Exif tags
I IPTC datasets
X XMP properties
x Tag number for Exif or IPTC tags (in hexadecimal)
g Group name (e.g., for Exif.Photo.UserComment, outputs Photo)
k Key (e.g., Exif.Photo.UserComment)
l Tag label (human readable tagname, e.g., for Exif.Photo.UserComment, outputs 'User comment')
n Tagname (e.g., for Exif.Photo.UserComment, outputs UserComment)
y Type (for available types, see Exif/IPTC/XMP types
c Number of components (for single entry types, the number of sizeof('type') in 'size'. For multi-entry types, the number of entries. See Exif/IPTC/XMP types)
s Size in bytes
v Plain data value (vanilla values, i.e., untranslated)
V Plain data value AND the word 'set ' (see 'MODIFY' COMMANDS
t Interpreted (translated) human readable data values
h Hex dump of the data

The order of the values in flgs is not respected, with output displayed as follows:

Tag number (x) | Plain 'set' (V) | Group (g) | Key (k) | Tagname (n) | Tagname label (l) | Type (y) | Components (c) | Size (s) | Value (E, I, X, v, t)

For example, displaying the IPTC tags in a file:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Print xgknlycsIt Stonehenge.jpg
0x0000 Envelope     Iptc.Envelope.ModelVersion                   ModelVersion                Model Version                  Short       1   2  4
0x005a Envelope     Iptc.Envelope.CharacterSet                   CharacterSet                Character Set                  String      3   3
0x0000 Application2 Iptc.Application2.RecordVersion              RecordVersion               Record Version                 Short       1   2  4
0x0078 Application2 Iptc.Application2.Caption                    Caption                     Caption                        String     12  12  Classic View

--Print flgs can be combined with --grep str or --key key to further filter the output.

-d tgt1*, --delete tgt1

Delete target(s) for the delete action. Possible targets are:

Option Description
a All supported metadata (the default for the delete action)
e Exif section
t Exif thumbnail only
i IPTC data
x XMP packet
c JPEG comment
C ICC Profile
I All IPTC data (removes broken metadata containing multiple IPTC blocks)

-i tgt2, --insert tgt2

Insert target(s) for the insert action (see DESCRIPTION, for metadata support in a file type). Possible targets are:

Option Description
a All supported metadata (the default for the insert action)
e Exif section
t Exif thumbnail. Only JPEG thumbnails can be inserted from a file called file-thumb.jpg
i IPTC data
x XMP packet
c JPEG comment
C ICC Profile, inserted from a file called .icc
X Insert metadata from an XMP sidecar file, .xmp. The remaining targets determine which metadata to include, possible are Exif, IPTC and XMP (default is all of these). Inserted XMP properties include those converted to Exif and IPTC
XX Insert "raw" XMP metadata from a sidecar file, .exv
- Insert from stdin. This option is intended for "filter" operations

Filter operations between extract and insert are possible, using the following template; xmllint(1) can be optionally used when extracting XMP sidecar files:

$ exiv2 -e{tgt3}- filename | [ xmllint .... |] exiv2 -i{tgt2}- filename

-e tgt3, --extract tgt3

Extract target(s) for the extract action. Possible targets are:

Option
Description
a All supported metadata (the default for the extract action)
e Exif section
t Extract Exif thumbnail only to a file called -thumb.jpg
i IPTC data
x XMP packet
c JPEG comment
p[<n>[,<m> ...]] Extract preview images to files called <file>-preview<n | m | ...>.jpg (--extract p extracts all previews). The thumbnail is included in any preview images
C Extract ICC profile, to a file called .icc
X Insert metadata from an XMP sidecar file, .xmp. The remaining targets determine which metadata to include, possible are Exif, IPTC and XMP (default is all of these). Inserted XMP properties include those converted to Exif and IPTC
XX Extract "raw" XMP metadata to a sidecar . Other targets cannot be used with this, as only XMP data is written
- Output to stdout (see --insert tgt2 for an example of this feature)

When extracting preview images, first list which previews are available:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --print p Stonehenge.jpg
Preview 1: image/jpeg, 160x120 pixels, 10837 bytes

then extract the preview by number (in this case, preview 1 is also the thumbnail):

$ exiv2 --verbose --extract p1 Stonehenge.jpg
File 1/1: Stonehenge.jpg
Writing preview 1 (image/jpeg, 160x120 pixels, 10837 bytes) to file ./Stonehenge-preview1.jpg

-c txt, --comment txt

JPEG comment string to set in the image (modify action). This option can also be used with the extract and insert actions to modify metadata on-the-fly.

-m cmdfile, --modify cmdfile

Commands for the modify action (see Command file format). In the format:

--modify ( file | - )

Parameter Description
file The file containing the 'modify' commands
- Stdin

This option can also be used with the extract and insert actions to modify metadata on-the-fly. See 'MODIFY' COMMANDS.

-M cmd, --Modify cmd

Command line for the modify action. This option can also be used with the extract and insert actions to modify metadata on-the-fly. See 'MODIFY' COMMANDS and 'Modify' command file.

-l dir, --location dir

Location (directory) for files to be inserted from or extracted to.

-S suf, --suffix suf

Use suffix suf for source files when using insert action (e.g., '.txt').

TOC

'MODIFY' COMMANDS

Tags can be altered using the 'modify' action and --Modify cmd or --modify cmdfile.

For example, adding an IPTC tag on the command line:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify "add Iptc.Application2.Credit String Mr. Mills" Stonehenge.jpg

or applying a set of 'modify' commands from a file (see 'Modify' command File):

$ exiv2 --modify cmd.txt Stonehenge.jpg

Multiple --Modify cmd and --modify cmdfile options can be combined together, with the changes applied left to right on each file. For example, applying one command line 'modify' then a 'modify' command file, then another command line 'modify':

$ exiv2 --Modify "set Iptc.Application2.Caption Stonehenge" --modify cmdfile.txt --Modify "add Iptc.Application2.Keywords Monument" Stonehenge.jpg

A list of modify commands can be generated from an existing file using --Print Vkyv. For example, only displaying the 'dc' 'modify' commands:

$ exiv2 --Print Vkyv --grep dc Stonehenge.jpg
set Xmp.dc.description                           LangAlt    lang="x-default" Classic View
set Xmp.dc.Family                                XmpBag     Robin

Using --modify -, a command file can be read from stdin instead of being a named file. For example:

$ cat cmdfile.txt | exiv2 --modify - Stonehenge.jpg

When modifying, only a correct metadata structure is enforced and it is possible to write tags with types and values different from those specified in the standards. This can include incorrect types (e.g., change Exif.Image.DateTime to a Float), duplicate Exif tags or incomplete metadata (e.g., deleting Exif.GPSInfo.GPSLatitudeRef, which works together with Exif.GPSInfo.GPSLatitude). While exiv2 is able to read all metadata that it can write, other programs may have difficulties with images that contain non standards-defined metadata.

Quotations with 'modify' commands

With --Modify cmd, quotation marks are use to surround the cmd. The Windows command line requires double quotes to be used, however generally, quotes inside that string, can be either single or double. Generally, UNIX based systems can use pairs of single or double quotes in any position. In both systems, inner string quotation marks may need to use the \ escape sequence.

See note on quotations when using XMP LangAlt values.

TOC

'Modify' command format

The format of a command is:

( set | add ) key [ [ type ] value ] | del key [ type ] | reg prefix namespace

Where:

Option Description
add Adds a tag. For Exif and IPTC repeatable tags, this adds a new tag, otherwise this replaces any existing tag (see Multiple elements and Duplicate Exif tags)
set Set the value of an existing tag with a matching key or if undefined, add the tag. If Duplicate Exif or IPTC repeatable tags already exist, this replaces them (see Multiple elements)
del Delete all occurrences of a tag that matches key, including any duplicate tags
reg Registers an XMP namespace with an XMP prefix (see XMP namespaces) If registering an existing prefix with a different namespace, then the namespace is updated

using the parameters:

Parameter Description
key An Exif, IPTC or XMP key (see Exiv2 key syntax)
type The type for the tag, a default is used if none is given. For built-in tags, the default is defined in the standard and for registered XMP tags, the default is XmpText (see Exif/IPTC/XMP types)
value The remaining text on the line is the value, and can optionally be enclosed in quotes (see Quotations with 'modify' commands). For Ascii, XmpAlt, XmpBag, XmpSeq and XmpText, the value is optional which is equivalent to an empty value ("")
prefix This is the XMP 'Group' that is being registered. This is case sensitive and must be unique within an image's metadata. e.g., For an "Exiv2" prefix, the tags for that group are available as Xmp.Exiv2.Tagname
namespace An identifier for the prefix. This is case sensitive and must be unique within an image's metadata. Built-in namespaces use a URL format, but they are not required to exist

TOC

'Modify' examples

Setting a Rational or SRational value

For the 'Rational' and 'SRational' formats, see Exif/IPTC/XMP types.

For example, modifying a 'Rational' number:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify"set Exif.Photo.MaxApertureValue 2485427/500000" Stonehenge.jpg

Setting an aperture value

Exif aperture values are stored in an apex-value format and when using the translated print option, are output as an Fnumber value. The APEX Fnumber translations use the formulae (in base 2):

apex-value  = log(Fnumber) * 2.0 / log(2.0)
Fnumber     = exp(apex-value * log(2.0) / 2.0)

The apex-value is a Rational and can be modified as shown in Setting a Rational or SRational value, however a convenience method is also provided to set an Fnumber directly. This uses the format:

F <value>

Where <value> is either an integer or decimal number.

For example, the following 'modify' will produce the same value as Setting a Rational or SRational value. This is displayed in vanilla and translated output:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify "set Exif.Photo.MaxApertureValue F5.6" Stonehenge.jpg
$ exiv2 --print e --grep MaxApertureValue Stonehenge.jpg
Exif.Photo.MaxApertureValue                  Rational    1  2485427/500000
$ exiv2 --print t --grep MaxApertureValue Stonehenge.jpg
Exif.Photo.MaxApertureValue                  Rational    1  F5.6

More information about APEX values is available from: http://en.wikipedia.org/wiki/APEX_system

Setting a Comment value

For the 'Comment' format, see Exif 'Comment' values.

For example, to set an Ascii comment:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify "set Exif.Photo.UserComment charset=Ascii Photo" Stonehenge.jpg
$ exiv2 --grep UserComment Stonehenge.jpg
Exif.Photo.UserComment                       Undefined  13  charset=Ascii Photo

or a Unicode comment:

$ exiv2 --Modify "set Exif.GPSInfo.GPSProcessingMethod charset=Unicode \\u0047\\u0050\\u0053" Stonehenge.jpg
$ exiv2 --grep GPSProcessingMethod Stonehenge.jpg
Exif.GPSInfo.GPSProcessingMethod             Undefined  14  charset=Unicode GPS

Registering an XMP namespace

For help with namespaces, see XMP namespaces.

Each XMP namespace has a prefix associated with it. For example, when modifying, this is declared using the string:

--Modify "reg myPrefix http://ns.myPrefix.me/"

When a non-standard group or tag belonging to that group is modified, the appropriate 'reg' 'modify' command must be included before that. For example, adding a myPhotos group with a weather tag and values:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify "reg myPhotos http://ns.myPhotos.org/" --Modify "add Xmp.myPhotos.weather XmpBag Cloudy" Stonehenge.jpg
$ exiv2 --Modify "reg myPhotos http://ns.myPhotos.org/" --Modify "set Xmp.myPhotos.weather XmpBag Sunny" Stonehenge.jpg
$ exiv2 --Modify "reg myPhotos http://ns.myPhotos.org/" --Modify "set Xmp.myPhotos.weather XmpBag Hot" Stonehenge.jpg
$ exiv2 --grep myPhotos Stonehenge.jpg
Xmp.myPhotos.weather                         XmpBag      3  Cloudy, Sunny, Hot

Adding new XMP tags

Provided that an XMP's group is defined (see Registering an XMP namespace), new tags can be added by assigning values.

For example, to add a RatingInPercent tag to a built-in namespace and a Surname tag to a registered namespace:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmp.RatingInPercent XmpText 98" Stonehenge.jpg
$ exiv2 --Modify "reg cm2e http://clanmills.com/exiv2/" --Modify "add Xmp.cm2e.Surname XmpText Mills" Stonehenge.jpg
$ exiv2 --grep RatingInPercent --grep Surname Stonehenge.jpg
Xmp.xmp.RatingInPercent                      XmpText     2  98
Xmp.cm2e.Surname                             XmpText     5  Mills

Setting an XMP LangAlt value

For the LangAlt format, see XMP LangAlt values. When setting a LangAlt tag, only one entry is allowed per modify.

For example, adding one default, one language/country and one language entry:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify "set Xmp.dc.description LangAlt Monument" Stonehenge.jpg
$ exiv2 --Modify "set Xmp.dc.description LangAlt lang=de-DE das Monument" Stonehenge.jpg
$ exiv2 --Modify "set Xmp.dc.description LangAlt lang="fr" les monuments" Stonehenge.jpg
$ exiv2 --grep description Stonehenge.jpg
Xmp.dc.description                           LangAlt     3  lang="x-default" Monument, lang="de-DE" das Monument, lang="fr" les monuments

To remove a language specification, set the value to the empty string. For example:

$ exiv2 --Modify "set Xmp.dc.description lang=de-DE" Stonehenge.jpg

To remove all language specifications, delete the key. For example:

$ exiv2 --Modify "del Xmp.dc.description" Stonehenge.jpg

Setting an XMP struct value

For the format of XMP structs, see Exiv2 key syntax and XMP structs.

To create a struct, first set the base key to an empty version of an array type. This can be achieved by either stating the array type and using the empty string, or by using XmpText and stating the array type.

For example, both of the following set the Xmp.xmpMM.History tag to an empty XmpSeq:

--Modify "add Xmp.xmpMM.History XmpSeq \"\""
--Modify "add Xmp.xmpMM.History XmpText type=Seq"

Numbered keys plus name and action can then be added.

For example, setting the Xmp.xmpMM.History tag to record the file being converted from tiff to JPEG, then saved.

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History XmpSeq \"\"" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[1]/stEvt:action derived" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[1]/stEvt:parameters converted from image/tiff to image/jpeg, saved to new location" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[2]/stEvt:action saved" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[2]/stEvt:instanceID xmp.iid:89A4EB97412C88632107D65978304F45" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[2]/stEvt:when 2021-08-13T10:12:09+01:00" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[2]/stEvt:softwareAgent MySuperPhotoFixer 1.0" Stonehenge.jpg
$ exiv2 --grep xmpMM Stonehenge.jpg
Xmp.xmpMM.History                            XmpText     0  type="Seq"
Xmp.xmpMM.History[1]                         XmpText     0  type="Struct"
Xmp.xmpMM.History[1]/stEvt:action            XmpText     7  derived
Xmp.xmpMM.History[1]/stEvt:parameters        XmpText    62  converted from image/tiff to image/jpeg, saved to new location
Xmp.xmpMM.History[2]                         XmpText     0  type="Struct"
Xmp.xmpMM.History[2]/stEvt:action            XmpText     5  saved
Xmp.xmpMM.History[2]/stEvt:instanceID        XmpText    40  xmp.iid:89A4EB97412C88632107D65978304F45
Xmp.xmpMM.History[2]/stEvt:when              XmpText    25  2021-08-13T10:12:09+01:00
Xmp.xmpMM.History[2]/stEvt:softwareAgent     XmpText    21  MySuperPhotoFixer 1.0

Nested arrays are permitted. For example, to add an additional XmpSeq to the first struct in the Xmp.xmpMM.History tag:

$ exiv2 --Modify "add Xmp.xmpMM.History[1]/stEvt:myBag XmpText type=Bag" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[1]/stEvt:mySeq[1]/stEvt:action open a file" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[1]/stEvt:mySeq[2]/stEvt:action convert" Stonehenge.jpg
$ exiv2 --Modify "add Xmp.xmpMM.History[1]/stEvt:mySeq[3]/stEvt:action save" Stonehenge.jpg
$ exiv2 --grep xmpMM Stonehenge.jpg
Xmp.xmpMM.History                            XmpText     0  type="Seq"
Xmp.xmpMM.History[1]                         XmpText     0  type="Struct"
Xmp.xmpMM.History[1]/stEvt:action            XmpText     7  derived
Xmp.xmpMM.History[1]/stEvt:parameters        XmpText    62  converted from image/tiff to image/jpeg, saved to new location
Xmp.xmpMM.History[1]/stEvt:mySeq             XmpText     0  type="Seq"
Xmp.xmpMM.History[1]/stEvt:mySeq[1]          XmpText     0  type="Struct"
Xmp.xmpMM.History[1]/stEvt:mySeq[1]/stEvt:action XmpText    11  open a file
Xmp.xmpMM.History[1]/stEvt:mySeq[2]          XmpText     0  type="Struct"
Xmp.xmpMM.History[1]/stEvt:mySeq[2]/stEvt:action XmpText     7  convert
Xmp.xmpMM.History[1]/stEvt:mySeq[3]          XmpText     0  type="Struct"
Xmp.xmpMM.History[1]/stEvt:mySeq[3]/stEvt:action XmpText     4  save
Xmp.xmpMM.History[2]                         XmpText     0  type="Struct"
Xmp.xmpMM.History[2]/stEvt:action            XmpText     5  saved
Xmp.xmpMM.History[2]/stEvt:instanceID        XmpText    40  xmp.iid:89A4EB97412C88632107D65978304F45
Xmp.xmpMM.History[2]/stEvt:when              XmpText    25  2021-08-13T10:12:09+01:00
Xmp.xmpMM.History[2]/stEvt:softwareAgent     XmpText    21  MySuperPhotoFixer 1.0

TOC

'Modify' command file

Commands for the 'modify' action can be read from a file. They are executed line-by-line, as though each command were passed to --Modify cmd on a single exiv2 line. In the file, any blank lines or additional white space is ignored and any lines beginning with a # are comments. When registering namespaces, place this in the file before the command to use it.

For help creating a command file from an existing file, see extracting modify commands.

For example, a cmd.txt file:

# Comments are ignored
add Xmp.dc.description LangAlt lang="x-default" Monument
set Xmp.dc.description LangAlt lang="de-DE" das Monument

# This command was generated from a file. Additional whitespace is ignored
set Xmp.xmp.Rating                               XmpText    0

# Additional whitespace is ignored
  del Iptc.Application2.Caption

# Use 'reg' before modifying any non-standard 'Group'
reg myPhotos https://ns.myPhotos.org/
set Xmp.myPhotos.weather Cloudy

would be run using:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --modify cmd.txt Stonehenge.jpg

For another example, see: https://www.exiv2.org/sample.html

TOC

EXIV2 GROUPS, TYPES AND VALUES

Exiv2 supports Exif 2.32, Adobe XMP 4.4.0 by default, although can be built with newer versions of the SDK, and many manufacturer's makernote tags.

Exiv2 tags

For an explanation of Exiv2 keys, see Exiv2 key syntax. The following groups are defined for the Exif family:

GPSInfo    Canon         Nikon1     NikonMe       OlympusFe8      SonyMisc2b
Image      CanonCf       Nikon2     NikonPc       OlympusFe9      SonyMisc3c
Image2     CanonCs       Nikon3     NikonPreview  OlympusFi       SonyMinolta
Image3     CanonFi       NikonAFT   NikonSi01xx   OlympusIp       SonySInfo1
Iop        CanonPa       NikonAf    NikonSi02xx   OlympusRd
MakerNote  CanonPi       NikonAf    NikonSiD300a  OlympusRd2      Samsung2
MpfInfo    CanonPr       NikonAf2   NikonSiD300b  OlympusRi       SamsungPictureWizard
Photo      CanonSi       NikonAf22  NikonSiD40    SamsungPreview
SubImage1  CanonTi       NikonCb1   NikonSiD80    Sigma	
SubImage2                NikonCb2   NikonVr
SubImage3  Casio         NikonCb2a  NikonWt       Sony1
SubImage4  Casio2        NikonCb2b                Sony1Cs
SubImage5                NikonCb3   Olympus       Sony1Cs2
SubImage6  Minolta       NikonCb4   Olympus2      Sony1MltCs7D
SubImage7  MinoltaCs5D   NikonFi    OlympusCs     Sony1MltCsA100
SubImage8  MinoltaCs7D   NikonFl1   OlympusEq     Sony1MltCsNew
SubImage9  MinoltaCsNew  NikonFl2   OlympusFe1    Sony1MltCsOld
SubThumb1  MinoltaCsOld  NikonFl3   OlympusFe2    Sony2
Thumbnail                NikonIi    OlympusFe3    Sony2Cs
           Panasonic     NikonLd1   OlympusFe4    Sony2Cs2
Pentax     PanasonicRaw  NikonLd2   OlympusFe5    Sony2010e
PentaxDng                NikonLd3   OlympusFe6    Sony2Fp
           Fujifilm      NikonLd4   OlympusFe7    SonyMisc1

A full list of built-in Exif, IPTC and XMP tags is available online at https://www.exiv2.org/metadata.html. To query Exiv2 Groups and Tagnames, a sample program called taglist is provided (see https://github.com/Exiv2/exiv2/blob/main/README-SAMPLES.md), which can be built from source (see https://github.com/Exiv2/exiv2/blob/main/README.md) or downloaded from https://www.exiv2.org/download.html.

For the Exif, IPTC and XMP groups:

  • The same tags that are available in Exif's Image group (e.g., Exif.Image.XResolution), are also available in Exif's Thumbnail, Image(2|3), SubImage(1-9) and SubThumb1 groups, (e.g., Exif.Thumbnail.XResolution).

  • Many camera manufacturer tags are available and are accessed as different Exif groups, using the manufacturer's name as a prefix (e.g., CanonCs is the Camera Settings for a Canon camera). Groups called the manufacturer name plus number, access the main tags in different file formats (e.g., Sony1 is for JPEGs, Sony2 is for others such as TIFF and ARW). Groups are available for use, depending upon which camera manufacturer and model captured the photo. Supporting the large number of tags for all the different manufacturers is an ongoing task, only partial support is available. The full unprocessed makernotes data is available in Exif.Photo.MakerNote.

  • Every Exif tag and IPTC dataset has a tag number (16 bit, 2 byte integer), which is unique within a Group (to display, see --Print x).

  • Some of the Exif tags and IPTC datasets are mirrored in the XMP specification (see https://www.exiv2.org/metadata.html).

  • The XMP specification is flexible and allows new custom 'Groups' and 'Tagnames' to be added (see Adding new XMP tags and 'Modify' command format). For example, the 'cm2e' 'Group' has been added, which has 'Father' and 'Family' Tagnames. Additionally, a 'Family' tag has been added to the built-in 'dc' Group:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --print x Stonehenge.jpg
Xmp.xmp.Rating                               XmpText     1  0
Xmp.xmp.ModifyDate                           XmpText    25  2015-07-16T20:25:28+01:00
Xmp.cm2e.Father                              XmpText    11  Robin Mills
Xmp.cm2e.Family                              XmpBag      0
Xmp.dc.description                           LangAlt     1  lang="x-default" Classic View
Xmp.dc.Family                                XmpBag      1  Robin

TOC

Exif/IPTC/XMP types

Each tag uses a specific type to store the value, with all elements in any array having the same type. Available types for the different 'Family' categories are:

Exif

Type Format Element Comment
Short A 16-bit (2-byte) unsigned integer Single -
Long A 32-bit (4-byte) unsigned integer Single -
Rational Two Long types. Numerator and denominator Single Use as X/Y (e.g., "31/1" is 31.0). See Setting a Rational or SRational value
Byte A string of 8-bit unsigned integers Single Use as a string (e.g., "Value")
SShort A 16-bit (2-byte) signed integer Single -
SLong A 32-bit (4-byte) signed integer Single -
SRational Two SLong types. Numerator and denominator Single Use as [+|-]X/Y (e.g., "-31/1" is -31.0). See Setting a Rational or SRational value
SByte A string of 8-bit signed integers Single Use as a string (e.g., "Value")
Float Signed single precision (4-byte) IEEE format Single Use as a signed decimal (e.g., "-0.5" is -0.5)
Double Signed double precision (8-byte) IEEE format Single Use as a signed decimal (e.g., "-0.5" is -0.5)
Ascii A string of 7-bit ASCII. NULL terminated Single Use as a string (e.g., "Value")
Comment A string of 7-bit ASCII. NULL terminated) Single Use as a string (e.g., "Value"). See Exif 'Comment' values
Undefined A string of 8-bit bytes Single Use as a string (e.g., "Value")

IPTC

Type Format Element Comment
String A string of ASCII Single -
Short A 16-bit (2-byte) unsigned integer Single -
Date A string of ASCII (8 bytes) Single See Date/Time formats
Time A string of ASCII (11 bytes) Single See Date/Time formats
Undefined A string of 8-bit bytes Single Use as a string (e.g., "Value")

XMP

Type Format Element Comment
LangAlt A string of text Multi Similar to XmpAlt. Alternative text for different languages. See XMP LangAlt values, Multiple elements and 'Modify' command format)
XmpAlt A string of text Multi An ordered array, any default value is first
XmpBag A string of text Multi An unordered array (e.g., 3 values, "Red, Yellow, Green") (see Multiple elements and 'Modify' command format
XmpSeq A string of text Multi An ordered array (e.g., 3 values, "Gold, Silver, Bronze") (see Multiple elements and 'Modify' command format
XmpText A string of text Single -

TOC

Exiv2 key syntax

The standard format for Exif and IPTC tags is:

Family.Group.Tagname

Definition Description
Family Either 'Exif' or 'Iptc'
Group The tag group within the family. e.g., for Exif, 'Image'
Tagname The tagname within a family and group. e.g., For Exif.Image, 'Model'

For example, Exif.Image.Model or Iptc.Application2.Subject .

XMP

In addition to the standard key syntax, XMP can also use an extended format:

Family.Group.Tagname[ <index>[ <value_types> ] ]+

Definition Description
Family i.e. 'Xmp'
Group The tag group within the family. e.g., for Xmp, 'dc'
Tagname The tagname within a family and group. e.g., For Xmp.dc, 'subject'
<index> An integer (1,...,n) surrounded by square brackets (e.g., [n], is the n'th item in the 'array')
<value_types> This is /name1 : name2 (e.g., /dim:length). Within a Family.Group.Tagname[n] and nested arrays, only one type of /name1 identifier is allowed, but many name2 values

For example, the Xmp.xmpMM.History tag would use the extended key:

Xmp.xmpMM.History[1]/stEvt:action

Nested structures are permitted and use multiple [ <index>[ <value_types> ] ] in the key. For example, if an Xmp.xmpMM.History tag defined an additional nested array struct, the extended key would be:

Xmp.xmpMM.History[1]/stEvt:myArray[1]/myName1:myName2

See XMP structs and Setting an XMP struct value.

More information about XMP keys and conventions for <value_types> is available from: https://www.adobe.com/content/dam/acom/en/devnet/xmp/pdfs/XMPSDKReleasecc-2020/XMPSpecificationPart2.pdf#G4.1132618

TOC

Multiple elements

Some IPTC datasets and XMP properties allow multiple elements to be stored, although they both do this in different ways.

IPTC

IPTC datasets marked as repeatable, can have multiple entries with the same key (i.e. Family.Group.Tagname) in the image metadata (for supported datasets, see https://www.exiv2.org/iptc.html, column R).

For example, a file containing three Iptc.Application2.Subject values:

$ exiv2 --grep Application2 Stonehenge_with_extra_data.jpg
Iptc.Application2.RecordVersion              Short       1  4
Iptc.Application2.Caption                    String     12  Monument
Iptc.Application2.Subject                    String     10  Stonehenge
Iptc.Application2.Subject                    String      6  Cloudy
Iptc.Application2.Subject                    String      5  Grass

XMP

XMP multiple values are grouped together within the same tag, using ", " as a separator (see Exif/IPTC/XMP types for supported types). If a default value exists for a LangAlt or XmpAlt tag, then this is the first item listed. For example, a file containing two Xmp.dc.description values (for format, see 'Modify' command format and three Xmp.dc.subject values:

$ exiv2 --grep description --grep subject Stonehenge_with_extra_data.jpg
Xmp.dc.description                           LangAlt     1  lang="x-default" Monument, lang="de-DE" das Monument
Xmp.dc.subject                               XmpBag      3  Stonehenge, Cloudy, Grass

TOC

Duplicate Exif tags

The Exif specification allows for duplicate tags, but this is currently unused by any current tag definitions.

TOC

Date/Time formats

The times and dates are stored using different formats in image metadata.

Exif

An Exif DateTime string is stored as 20 ascii bytes (including trailing NULL) in the format:

YYYY:MM:DD HH:mm:SS

where YYYY:MM:DD is the year, month and day and HH:mm:SS is the hour, minute and second (e.g., "2010:09:15 08:45:21" is 08:45:21 on 15-Aug-10).

The options --timestamp and --Timestamp will accept files in which the Date part, has been incorrectly stored as YYYY-MM-DD.

IPTC

An IPTC 'Date' type is stored in the format:

YYYYMMDD

where YYYYMMDD is the year, month and day (e.g., "20100915" is 15-Aug-10).

An IPTC 'Time' type is stored in the format:

HHMMSScHHMM

where HHMMSS refers to local time's hour, minutes and seconds and, HHMM refers to hours and minutes with c being ahead (+) or behind (-) Universal Coordinated Time (UCT) as described in ISO 8601 (e.g., 084515+0100 is 08:45:15, which is +1 hour different from UCT).

Makernote tags

There is no one single format. Different camera manufacturers use different formats, even within their own sets of tags. Some tags use encoded data that does not conform to any official format.

TOC

Exif 'Comment' values

Exif 'Comment' values can include an optional charset definition to explain how to interpret the rest of the value. This is used by tags such as Exif.Photo.UserComment, Exif.GPSInfo.GPSProcessingMethod and Exif.GPSInfo.GPSAreaInformation.

The format of the value is:

[ charset= ( Ascii | Jis | Unicode | Undefined ) ] comment

If the charset is not specified then the default is Undefined.

For example, if Ascii and Unicode Comments have been set:

$ exiv2 --grep UserComment --grep GPSProcessingMethod Stonehenge.jpg
Exif.Photo.UserComment                       Undefined  16  charset=Ascii Monument
Exif.GPSInfo.GPSProcessingMethod             Undefined  14  charset=Unicode GPS

The reported size of the 'value' is calculated as:

8 Bytes (for "charset=val ") + (the rest of the value) * (2 Bytes for Unicode, otherwise 1 Byte)

TOC

XMP namespaces

Every XMP 'Group' (called a prefix) has an identifier (called a namespace) associated with it. Within an image's metadata, both namespaces and prefixes are unique.

exiv2 has standards defined prefixes and namespaces built-in, which can be displayed in the format: xmlns=<prefix>:<namespace>. For example, here, only a couple are shown:

$ exiv2 --verbose --version --grep xmlns
...
xmlns=xmp:http://ns.adobe.com/xap/1.0/ 
xmlns=dc:http://purl.org/dc/elements/1.1/
...

To list the XMP prefixes and namespaces used by an image's metadata (in the format xmlns:<prefix>=<namespace>), extract a sidecar file to stdout. For example, here, other data is not included:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --extract X- Stonehenge.jpg
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0-Exiv2">
 <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <rdf:Description rdf:about=""
    xmlns:xmp="http://ns.adobe.com/xap/1.0/"
    xmlns:cm2e="http://clanmills.com/exiv2/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:tiff="http://ns.adobe.com/tiff/1.0/"
    xmlns:exif="http://ns.adobe.com/exif/1.0/"
    xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/"
   xmp:Rating="0"
   xmp:ModifyDate="2015-07-16T20:25:28+01:00"
   xmp:CreateDate="2015-07-16T15:38:54.00"
   ...

New XMP namespaces can be registered, allowing new 'Groups' and 'Tagnames' to be created (see Registering an XMP namespace).

Within an image's metadata, built-in prefixes can be re-registered with different namespaces. In this case, exiv2 will use any new definitions.

TOC

XMP LangAlt values

A 'LangAlt' string provides alternative text for different languages, with individual entries separated using a , . Each entry is in the format:

[lang=( x-default | <lang> | (<lang>-<country>)] text
Definition Description
x-default The default value. If defined, a LangAlt string always lists this entry first
lang A language code as defined in IEFT RFC 3066
country A country code as defined in IEFT RFC 3066
text The text to use for a language definition

The <lang>-<country> combination is useful where a country uses a different version of a common language (e.g. Swiss-French, would be "fr-CH"). The <lang> or <lang>-<country> can be optionally surrounded by double quotes (single quotes are not allowed). If no language is specified, the default value is x-default. Any x-default entry is always listed first.

For example, 3 language definitions including a default value, a British English value and a general French value:

lang="x-default" Elevator, lang="en-gb" Lift, lang="fr" ascenseur

TOC

XMP structs

XMP structs group XmpText elements together in an array arrangement. The elements themselves can contain other structs, allowing complex nested array structures to be created. The tags in a struct use the extended XMP version of the Exiv2 key syntax.

In a struct, the base key (e.g., Xmp.xmpMM.History) contains:

type=<array_type>

where <array_type> is 'Alt' for XmpAlt, 'Bag' for XmpBag or 'Seq' for XmpSeq.

Each numbered base key (e.g., Xmp.xmpMM.History[n]) contains the string: type="Struct" and each numbered base key plus value type (e.g. Xmp.xmpMM.History[n]/stEvt:action), contains the data.

For example, the Xmp.xmpMM.History tag recording that a file has been converted from tiff to JPEG, then saved.

Xmp.xmpMM.History                            XmpText     0  type="Seq"
Xmp.xmpMM.History[1]                         XmpText     0  type="Struct"
Xmp.xmpMM.History[1]/stEvt:action            XmpText     7  derived
Xmp.xmpMM.History[1]/stEvt:parameters        XmpText    62  converted from image/tiff to image/jpeg, saved to new location
Xmp.xmpMM.History[2]                         XmpText     0  type="Struct"
Xmp.xmpMM.History[2]/stEvt:action            XmpText     5  saved
Xmp.xmpMM.History[2]/stEvt:instanceID        XmpText    40  xmp.iid:89A4EB97412C88632107D65978304F45
Xmp.xmpMM.History[2]/stEvt:when              XmpText    25  2021-08-13T10:12:09+01:00
Xmp.xmpMM.History[2]/stEvt:softwareAgent     XmpText    21  MySuperPhotoFixer 1.0

For an example of modifying a struct, see Setting an XMP struct value.

More information about structs is available from: https://wwwimages2.adobe.com/content/dam/acom/en/devnet/xmp/pdfs/XMP%20SDK%20Release%20cc-2016-08/XMPSpecificationPart1.pdf#G5.873540

TOC

CONFIGURATION FILE

exiv2 can read an optional configuration file, which allows additional lens definitions to be added to translated output. On UNIX based systems, this file is called .exiv2 and on Windows, exiv2.ini. The file is searched for first in the current directory, then in the home directory (on UNIX based systems, ~/ and on Windows, %USERPROFILE%\).

You can determine the name of the file and where it is searched for, with the command:

$ exiv2 --verbose --version --grep config_path
exiv2 1.0.0.9
config_path=/Users/rmills/.exiv2

The configuration file uses the Windows *.ini format (see https://en.wikipedia.org/wiki/INI_file) and has sections for each of the major camera manufactures: Canon, Minolta, Nikon, Olympus, Pentax and Sony. The configuration file definitions override any existing values.

For example, to add a new lens definition, first obtain the lensID for your camera:

$ curl --silent -O https://clanmills.com/Stonehenge.jpg
$ exiv2 --print v --grep lens/i Stonehenge.jpg
0x0083 Nikon3       LensType           Byte       1  14
0x0084 Nikon3       Lens               Rational   4  180/10 2500/10 35/10 63/10
0x008b Nikon3       LensFStops         Undefined  4  55 1 12 0
0x000c NikonLd3     LensIDNumber       Byte       1  146
0x000d NikonLd3     LensFStops         Byte       1  55

Then using the 'LensIDNumber' value (i.e., 146), add the following text to the configuration file:

[nikon]
146=Robin's Sigma Lens

The text will now appear when the translated print option is used:

$ exiv2 --print t --grep lens/i Stonehenge.jpg
Exif.Nikon3.LensType                         Byte        1  D G VR
Exif.Nikon3.Lens                             Rational    4  18-250mm F3.5-6.3
Exif.Nikon3.LensFStops                       Undefined   4  4.58333
Exif.NikonLd3.LensIDNumber                   Byte        1  Robin's Sigma Lens
Exif.NikonLd3.LensFStops                     Byte        1  F4.6

TOC

EXAMPLES

  • exiv2 *.jpg
    Prints a summary of the Exif information for all the JPEG files in the current directory (the same as exiv2 print *.jpg). The summary is brief and does not use the Family.Group.Tagname format

  • exiv2 --grep date/i https://clanmills.com/Stonehenge.jpg
    Prints tags in https://clanmills.com/Stonehenge.jpg, where the key (see Exiv2 key syntax) contains the string date (/i searches case insensitive). When not including --print mod or --Print flgs, the default output becomes --print a (i.e., print all)

  • exiv2 --print i image.jpg
    Prints the IPTC datasets in image.jpg

  • exiv2 --Print IkytEX image.jpg
    Prints (with finer grained control) the Exif tags and XMP properties in image.jpg. The tag's key (see Exiv2 key syntax), type and translated value are displayed

  • exiv2 rename image.jpg
    Renames image.jpg (taken on 13-Nov-05 at 22:58:31) to 20051113_225831.jpg

  • exiv2 --rename ":basename:_%Y-%m" image.jpg
    Renames image.jpg using the basename (i.e., image) and values defined in iconv_open(3) to image_2005-11.jpg. The values for time and date are taken from the Exif metadata

  • exiv2 --extract t image1.jpg image2.jpg
    Extracts (copies) the Exif thumbnails from image1.jpg into image1-thumb.jpg and from image2.jpg into image2-thumb.jpg.

  • exiv2 --insert t image1.jpg image2.jpg
    Inserts (copies) thumbnails image1-thumb.jpg into image1.jpg and image2-thumb.jpg into image2.jpg.

  • exiv2 --extract p1,2 image.jpg
    Extracts (copies) previews 1 and 2 from image.jpg, into image-preview1.jpg and image-preview2.jpg. Use exiv2 --print p image.jpg to display a list of available previews for image.jpg.

  • exiv2 --extract X image.jpg
    Extracts (copies) metadata tags from image.jpg, into an XMP sidecar file, image.xmp. In the process, this converts selected Exif tags and IPTC datasets to XMP properties.

  • exiv2 --insert X image.jpg
    Inserts (copies) metadata from an XMP sidecar file, image.xmp, into image.jpg. The resulting Exif tags and IPTC datasets are converted from the equivalent XMP properties in the sidecar file.

  • exiv2 --extract X --Modify "add Xmp.dc.subject Sunset" image.jpg
    Extracts (copies) metadata tags from image.jpg, applies --Modify cmd to those tags and then saves in an XMP sidecar file, image.xmp. While saving, selected Exif tags and IPTC datasets are converted to XMP properties. Multiple --Modify cmd and --modify cmdfile can be used.

  • exiv2 --extract X- image1.jpg | exiv2 --insert X- image2.jpg
    Extracts (copies) the image1.jpg metadata as XMP sidecar data and inserts it directly into image2.jpg. --Modify cmd and --modify cmdfile can also be added when extracting from image1.jpg.

  • exiv2 delete image.jpg
    Deletes all the metadata in image.jpg.

  • exiv2 --delete tC image.jpg
    Deletes the thumbnail and ICC profile in image.jpg.

  • exiv2 --adjust 1:00:00 image.jpg
    Adjusts Exif timestamps in image.jpg, adding 1 hour

  • exiv2 --Modify "set Exif.Photo.UserComment charset=Ascii New Exif comment" image.jpg
    Sets the Exif comment in image.jpg, to an ASCII string with the value New Exif comment.

  • exiv2 --Modify "set Exif.GPSInfo.GPSLatitude 4/1 15/1 33/1" --Modify "set Exif.GPSInfo.GPSLatitudeRef N" image.jpg
    Sets the latitude to 4 degrees, 15 minutes and 33 seconds north in image.jpg. The Exif standard stipulates that the GPSLatitude tag consists of three Rational numbers for the degrees, minutes and seconds of the latitude and GPSLatitudeRef contains either 'N' or 'S' for north or south latitude respectively.

  • exiv2 --Modify "reg myPrefix http://ns.myPrefix.me/" --Modify "add Xmp.myPrefix.Whom Mr. Mills" Stonehenge.jpg
    Registers a new XMP namespace called http://ns.myPrefix.me/ and a new XMP group called myPrefix. This new Group has a new Whom tag added to it.

  • exiv2 --location /tmp --suffix .CRW /data/*.JPG
    Copy all metadata from CRW files in the /tmp directory to JPG files with corresponding basenames in the /data directory. Note that this copies metadata as is, without any modifications to adapt it to the requirements of the target format. Some tags copied like this may not make sense in the target image.

  • exiv2 fixiso image.jpg
    Adds the Exif ISO metadata (if missing) to image.jpg. This is for Nikon and Canon cameras only and copies the camera maker's value into the Exif metadata.

TOC

ENVIRONMENT

TZ

This is the timezone to use when adjusting for daylight savings time (DST) and affects the changing of the the time and date (e.g., when adjusting or renaming). See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones for a list of valid values to use. The variable is not set by default for Windows and an attempt is made to obtain the timezone from the OS. If this fails, the DST rules for the United States are used. This can be corrected by defining TZ.

TOC