exiftool-vendored.pl
Version:
Vendored perl ExifTool for Node.js
965 lines (821 loc) • 81 kB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
<html>
<head>
<title>ExifTool FAQ</title>
<link rel=stylesheet type='text/css' href='style.css' title='Style'>
<style type="text/css">
<!--
pre { color: #800; margin-left: 2em }
ol.index { margin: 0; padding: 0 0 0 2em }
.U { color: #c84 } /* unused data block */
.prog { padding: 0.5em; border: 1px solid gray; background: #fee }
-->
</style>
</head>
<body>
<div class='index'>
<ol class='index'>
<li><a href="#Q1">Discussion forum</a></li>
<li><a href="#Q2">Determining tag names</a></li>
<li><a href="#Q3">ExifTool doesn't read/write properly</a></li>
<li><a href="#Q4">Aperture and shutter speed</a></li>
<li><a href="#Q5">Date and time formats</a></li>
<li><a href="#Q6">"Can't convert TAG" errors</a></li>
<li><a href="#Q7">Deleting all EXIF from a TIFF</a></li>
<li><a href="#Q8">Writing Make, Model & MakerNotes</a></li>
<li><a href="#Q9">Tag locations when copying</a></li>
<li><a href="#Q10">Coded character sets</a></li>
<li><a href="#Q11">User-defined tags</a></li>
<li><a href="#Q12">Export to database</a></li>
<li><a href="#Q13">Output file size and image quality</a></li>
<li><a href="#Q14">GPS coordinate format</a></li>
<li><a href="#Q15">MakerNote errors</a></li>
<li><a href="#Q16">Some files not renamed</a></li>
<li><a href="#Q17">List-type tags</a></li>
<li><a href="#Q18">Windows character encoding</a></li>
<li><a href="#Q19">Formatting tag values</a></li>
<li><a href="#Q20">Write errors (repair corrupted EXIF)</a></li>
<li><a href="#Q21">Newlines in values</a></li>
<li><a href="#Q22">Order of operations</a></li>
<li><a href="#Q23">"0 image files updated"</a></li>
<li><a href="#Q24">Date/time gets reset to today</a></li>
<li><a href="#Q25">Image validation</a></li>
<li><a href="#Q26">Import from database</a></li>
<li><a href="#Q27">Windows .BAT file problems</a></li>
<li><a href="#Q28">Copying a shifted date/time</a></li>
</ol>
</div>
<h1 class='up'>ExifTool FAQ</h1>
<a name="Q1"></a>
<p>1. <b>"Is there a forum for discussing ExifTool issues?"</b></p>
<blockquote>
ExifTool issues can be discussed on the ExifTool forum at
<a href="http://u88.n24.queensu.ca/exiftool/forum/">http://u88.n24.queensu.ca/exiftool/forum/</a>
</blockquote>
<a name="Q2"></a>
<p>2. <b>"How do I determine the tag name for some information?"</b></p>
<blockquote>When you run exiftool, by default it prints descriptions, not tag
names, for the information it extracts. These descriptions are in English
unless the <code>-lang</code> option is used to select another language. Note
that descriptions often contain spaces between words, but tag names never do.
Also, tag names are always English, regardless of the <code>-lang</code>
setting. To print the tag names instead instead of descriptions, use the
<code>-s</code> option when extracting information. eg)
<pre>exiftool -s image.jpg</pre>
Valid characters in tag names are <code>A-Z</code>, <code>a-z</code>,
<code>0-9</code>, <code>_</code> and <code>-</code>. See the
<a href="TagNames/index.html">tag name documentation</a> for a complete list of
available tag names.</blockquote>
<blockquote>Tag names may be optionally prefixed by a family 0 or 1 group name
to specify a particular information type or location. Use the
<code>-g0</code> and <code>-g1</code> (or
<code>-G0</code> and <code>-G1</code>) options when extracting
information to see the corresponding group names.
</blockquote>
<a name="Q3"></a>
<p>3a. <b>"ExifTool reports the wrong value or doesn't extract a tag"</b>,
<br>3b. <b>"ExifTool doesn't write a tag properly"</b>, or
<br>3c. <b>"Other software can't read information written by ExifTool"</b></p>
<blockquote><i>[Also see <a href="#Q23">FAQ number 23</a> for reasons why
ExifTool may not write some tags to certain file types.]</i></blockquote>
<blockquote>First, make sure you are looking at the right information. Use
ExifTool with a command like this to extract all information from the file,
along with the location it was written:
<pre>exiftool -a -G1 -s c:\images\test.jpg</pre>
In this command, <code>-a</code> allows duplicate tags to be extracted,
<code>-G1</code> shows the family 1 group name (ie. the location) of each tag,
and <code>-s</code> shows the tag names instead of their descriptions.
(Substitute the path name of your file in place of
"<code>c:\images\test.jpg</code>".)</blockquote>
<blockquote>When duplicate tags exist, only one is extracted unless the
<code>-a</code> option is used. Beware that options like <code>-EXIF:all</code>
select all EXIF tags from the extracted tags, so EXIF tags hidden by duplicate
tags in other locations will not appear in the output for
<code>-EXIF:all</code>. For example, the command
<pre>exiftool -gps:all image.jpg</pre>
will NOT necessarily extract all GPS tags because some GPS tags may have been
suppressed by same-named tags in other groups. To be sure all GPS tags are
extracted, the <code>-a</code> option must be used:
<pre>exiftool -a -gps:all image.jpg</pre>
If you are having problems with other software reading information written by
ExifTool, if possible try first writing the information from the other software,
then use ExifTool (with the <code>-a</code> and <code>-G1</code> options) to
determine where the information was written. Once you know where it should go,
you can use ExifTool to write to this location. You can read or write
information in a specific location by prefixing the tag name on the command line
with the desired group name. eg.) "<code>-ExifIFD:DateTimeOriginal</code>"
</blockquote>
<blockquote>This problem may also occur if contradictory information exists in
different meta information formats within the same file. For example, often XMP
will be ignored if IPTC exists and the Photoshop:IPTCDigest does not agree with
the IPTC content. The
<a href="http://www.metadataworkinggroup.org/">Metadata Working Group</a>
recommends techniques to keep the EXIF, IPTC and XMP metadata synchronized.
These recommendations are implemented by the ExifTool
<a href="TagNames/MWG.html">MWG tags</a>. For maximum compatibility with the
widest range of applications, it is suggested that these MWG tags be used
whenever possible.</blockquote>
<blockquote>One final note: When writing, the <code>-v2</code> option may be
useful because it provides details about what ExifTool is writing, and where.
</blockquote>
<a name="Q4"></a>
<p>4. <b>"ExifTool reports more than one shutter speed or aperture value, and
they are slightly different"</b></p>
<blockquote>
There are a number of different ways that aperture and shutter speed information
are stored in many images. The standard EXIF values (EXIF:FNumber and
EXIF:ExposureTime) should correspond to the values displayed by your camera,
but these values may have been rounded off. The corresponding EXIF APEX
values (EXIF:ApertureValue and EXIF:ShutterSpeedValue) may be different due
to their own round-off errors. If available, the MakerNotes values may be
the most accurate because they haven't been rounded off to nice even values
for display, so with these you may see odd values like 1/102 instead of
1/100, etc.
</blockquote>
<a name="Q5"></a>
<p>5. <b>"How do I format date and time information for writing?"</b></p>
<blockquote>All information (including date/time information) is written in the
same format as it is read out. When reading, ExifTool converts all date and
time information to standard EXIF format, so this is also the way it is
specified when writing. The standard EXIF date/time format is
"<code>YYYY:mm:dd HH:MM:SS</code>", and some meta information formats such as
XMP also allow sub-seconds and a timezone to be specified. The timezone format
is "<code>+HH:MM</code>", "<code>-HH:MM</code>" or "<code>Z</code>". For
example:
<pre>exiftool -xmp:dateTimeOriginal="2005:10:23 20:06:34.33-05:00" a.jpg
</pre>
When writing XMP or other information types which allow incomplete date/time
values, the following input formats are also accepted:
<pre>YYYY
YYYY:mm
YYYY:mm:dd
YYYY:mm:dd HH:MM
</pre>
Having said this, ExifTool is very flexible about the actual format of input
date/time values when writing, and will attempt to reformat any values into the
standard format unless the <code>-n</code> option is used. Any separators may
be used (or in fact, none at all). The first 4 consecutive digits found in the
value are interpreted as the year, then next 2 digits are the month, and so on.
<i class=lt>[The year must be 4 digits. Other fields are expected to be 2
digits, but a single digit is allowed if the subsequent character is a
non-digit.]</i> For EXIF date/time values, all 6 date/time fields must exist
("<code>YYYYmmddHHMMSS</code>"), but XMP date/time values require only the year
("<code>YYYY</code>"). This feature facilitates useful operations such as
setting date/time tags from a date embedded in the file name. For example, the
command
<pre>exiftool "-alldates<filename" c:\images</pre>
will set the common date/time tags from the file name for all images in the
directory "<code>c:\images</code>". This will work for any file name which
matches the above criteria (eg. "IMG_20110927_103000.jpg").
<i class=lt>[AllDates is a shortcut for 3 tag names: DateTimeOriginal,
CreateDate and ModifyDate. See the <a href="TagNames/Shortcuts.html">Shortcuts
Tags documentation</a> for more information.]</i></blockquote>
<blockquote>The <code>-d</code> option provides additional flexibility in
parsing strings when writing date/time tags if POSIX::strptime or Time::Piece is
installed and the ExifTool version is 10.32 or later (use "<code>exiftool -ver -v</code>"
to check the installed packages). The format of the <code>-d</code> argument is
the same for reading and writing.</blockquote>
<blockquote><b>Special feature</b>: A value of "<code>now</code>" may be used to
represent the current time when writing any date/time tag. For example:
<pre>exiftool -xmp:dateTimeOriginal=now a.jpg</pre>
<i class=lt>[There is also a <a href="TagNames/Extra.html">Now tag</a> which may
be used for a similar purpose by copying its value to another tag, but copying
tags adds an extra read stage to the processing which is best avoided if
performance is an issue.]</i>
</blockquote>
<a name="Q6"></a>
<p>6. <b>"I get '<code>Can't convert TAG (not in PrintConv)</code>' errors when
writing a tag"</b></p>
<blockquote>
By default, ExifTool applies a print conversion (PrintConv) to extracted
information to make the output more human-readable. Some conversions involve
lookup tables which are documented in the <b>Values</b> column of the
<a href="TagNames/index.html">tag name documentation</a>. For example, the
GPSAltitudeRef tag defines the following conversions:
<pre>0 = Above Sea Level
1 = Below Sea Level
</pre>
For this tag, a value of '0' is printed as 'Above Sea Level', and '1' is printed
as 'Below Sea Level'. Reading and writing with ExifTool is symmetrical <i>[with
the possible exception of list-type tags -- see <a href="#Q17">FAQ number 17</a>
below]</i>, so a value that is printed as 'Above Sea Level' must also be written in
that form. (In other words, the inverse print conversion is applied when writing
values.) For example, to write GPSAltitudeRef you can type:
<pre>exiftool -gpsaltituderef="Above Sea Level" image.jpg
</pre>
or any unambiguous short form may be used and ExifTool will know what you mean, eg)
<pre>exiftool -gpsaltituderef=above image.jpg
</pre>
Alternatively, the print conversion can be disabled for all tags with the
<code>-n</code> option, or for individual tags by suffixing the tag name with a
'<code>#</code>' character. In either case the printed value of GPSAltitudeRef
will be '0' or '1' when extracting information, and the value is written in the
same way. So following two commands have exactly the same effect as above:
<pre>exiftool -gpsaltituderef=0 -n image.jpg
exiftool -gpsaltituderef#=0 image.jpg
</pre>
Integer values may also be specified in hexadecimal (with a leading '0x'). For
example, the following commands are all equivalent:
<pre>exiftool -flash=1 -n image.jpg
exiftool -flash=0x1 -n image.jpg
exiftool -flash#=1 image.jpg
exiftool -flash#=0x1 image.jpg
exiftool -flash=fired image.jpg
</pre></blockquote><blockquote class=prog>
<b>Programmers</b>: These techniques look like this when calling Image::ExifTool
functions from a Perl script:
<pre>$exifTool->SetNewValue(flash => 1, Type => 'ValueConv');
$exifTool->SetNewValue(flash => 0x1, Type => 'ValueConv');
$exifTool->SetNewValue('flash#' => 1);
$exifTool->SetNewValue('flash#' => 0x1);
$exifTool->SetNewValue(flash => 'fired');
</pre></blockquote>
<a name="Q7"></a>
<p>7. <b>"I can't delete all EXIF information from a TIFF file using
'<code>exiftool -exif:all= img.tif</code>'"</b></p>
<blockquote>This is because of the way a TIFF file is structured. With a JPEG
image, this command removes IFD0 (the main Image File Directory) as well as any
subdirectories, thus removing all EXIF information. But with the TIFF format,
the main image itself is stored in IFD0, so deleting this directory would
destroy the image. The same is true for any TIFF-based RAW file such as DNG,
CR2, NEF, etc. For these types of files, ExifTool just deletes the ExifIFD
subdirectory, so any information stored in other directories is preserved (BUT
NOTE THAT WITH PROPRIETARY RAW FORMATS THIS MAY DELETE INFORMATION THAT IS
NECESSARY FOR PROPER RENDERING OF THE IMAGE).
</blockquote>
<blockquote>Use "<code>exiftool -a -G1 -s img.tif</code>" to see where the
information is stored. Any tags remaining in other IFD's must be deleted
individually from a TIFF-format file if desired. For convenience, a
<a href="TagNames/Shortcuts.html">shortcut tag</a> is provided to simplify the
deletion of common metadata tags from IFD0 by adding "<code>-CommonIFD0=</code>"
to the command line.
</blockquote>
<a name="Q8"></a>
<p>8a. <b>"All maker note information is lost if I change the Make or Model tag"</b>, or
<br>8b. <b>"I can't copy maker note information to an image"</b>, or
<br>8c. <b>"I can't view a RAW image after changing the model tag"</b></p>
<blockquote>
The Make and Model tags are used by some image utilities (including ExifTool) to
determine the format of the maker note information. Deleting or changing either
of these tags may prevent these utilities from recognizing or properly
interpreting the maker notes (which, for a RAW image, may mean that the image
can no longer be properly rendered). Also beware that the maker notes
information may be damaged if an image is edited when the maker notes are not
properly recognized. So it is a good idea not to edit the Make and Model tags in
the first place.</blockquote>
<blockquote>If you really want to delete the Make and Model information, you
might as well delete the maker notes too. You can do this with either of the
following commands:
<pre>exiftool -make= -model= -makernotes:all= image.jpg
exiftool -make= -model= -makernotes= image.jpg
</pre>
For the same reason, maker notes can not be copied to an image with an
incompatible Make or Model. To do this, the Make and Model tags must also be
copied. eg)
<pre>exiftool -tagsfromfile src.jpg -makernotes -make -model dst.jpg
</pre>
(Note that in this case the "<code>-makernotes:all</code>" syntax does not work
because it attempts to copy the maker note tags individually. Since maker note
tags may not be created individually, they must instead be copied as a block
with "<code>-makernotes</code>".)
</blockquote>
<a name="Q9"></a>
<p>9a. <b>"The information is different when I copy all tags to a new file"</b>, or
<br>9b. <b>"The tag locations change when I use <code>-tagsfromfile</code>
to copy information"</b></p>
<blockquote>
This feature is explained under the <code>-tagsFromFile</code> option in
the <a href="exiftool_pod.html">exiftool application documentation</a>, but the
question is common enough that it is discussed here in more detail.</blockquote>
<blockquote>By default, ExifTool will store information in preferred locations
when either writing new information or copying information between files. This
freedom allows ExifTool to write or copy information to files of different
formats without requiring the user to know details about where the information
is stored.</blockquote>
<blockquote>The preferred general locations for information written to JPEG
images are 1) EXIF, 2) IPTC and 3) XMP. As an example, information extracted
from the maker notes will be preferentially written (on a tag-by-tag basis) in
EXIF format when copying information between two JPEG images. But if a specific
tag doesn't exist in EXIF, then the tag is written to the first valid group in
the order specified above. The advantage of "translating" the information to
EXIF is that it then becomes readable by applications which only support
standard EXIF. The disadvantage is that you don't get an exact copy of the
original information structure.</blockquote>
<blockquote>But ExifTool gives you the ability to customize this behaviour to
write the information to wherever you want. This is done by specifying a group
name for the tag(s) to be copied. This applies even if the group name is
"<code>all</code>", in which case the original family 1 group is preserved. So
to copy all information and preserve the original structure, use this syntax:
<pre>exiftool -tagsfromfile src.jpg -all:all dst.jpg
</pre>
In this command, since no destination tag was specified, the destination is the
same as the source (ie. "<code>-all:all>all:all</code>"), so the information is
copied to the same family 1 group.</blockquote>
<blockquote>Here are some examples to show you the type of control you have over
where the information is written. All commands in each example are equivalent:
<pre><span class='blk'># copy all tags to preferred groups (no destination group)</span>
exiftool -tagsfromfile src.jpg dst.jpg
exiftool -tagsfromfile src.jpg -all dst.jpg
exiftool -tagsfromfile src.jpg "-all>all" dst.jpg
exiftool -tagsfromfile src.jpg "-all:all>all" dst.jpg
<span class='blk'># copy all tags, preserving family 1 group (destination group 'all')</span>
exiftool -tagsfromfile src.jpg -all:all dst.jpg
exiftool -tagsfromfile src.jpg "-all>all:all" dst.jpg
exiftool -tagsfromfile src.jpg "-all:all>all:all" dst.jpg
<span class='blk'># copy all tags to EXIF group (destination group 'exif')
# [the destination family 1 group is the preferred EXIF IFD]</span>
exiftool -tagsfromfile src.jpg "-all>exif:all" dst.jpg
exiftool -tagsfromfile src.jpg "-all:all>exif:all" dst.jpg
<span class='blk'># copy XMP tags to XMP group (destination group 'xmp')
# [the destination family 1 group is the preferred XMP namespace]</span>
exiftool -tagsfromfile src.jpg "-xmp:all" dst.jpg
exiftool -tagsfromfile src.jpg "-xmp:all>xmp:all" dst.jpg
<span class='blk'># copy XMP tags, preserving family 1 group (destination group 'all')</span>
exiftool -tagsfromfile src.jpg "-xmp:all>all:all" dst.jpg
<span class='blk'># copy XMP tags to preferred groups (no destination group)</span>
exiftool -tagsfromfile src.jpg "-xmp:all>all" dst.jpg
<span class='blk'># copy XMP tags to EXIF only (destination group 'exif')
# [the destination family 1 group is the preferred EXIF IFD]</span>
exiftool -tagsfromfile src.jpg "-xmp:all>exif:all" dst.jpg
</pre>
The same rules illustrated above also apply when copying individual tags.</blockquote>
<blockquote>Note: If no destination group is specified, a new tag is created if
necessary only in the preferred group, but if the same tag already exists in
another group, then this information is also updated. (Otherwise inconsistent
values for the same information would exist in different locations. Of course,
you can always generate inconsistencies like this if you really want to by
specifically writing contradictory information to different groups.)
</blockquote>
<blockquote>Certain types of meta information (such as EXIF, IPTC, XMP and
ICC_Profile) may also be <b>copied as a block</b>. This technique copies all
meta information, even if ExifTool doesn't have the ability to write some
individual tags contained in the block. For all block types except EXIF, the
metadata is copied byte-for-byte from the original image. With EXIF however,
the metadata may be restructured to ensure that it is self-contained. Also note
that EXIF may not be written as a block to TIFF-based file formats. Beware that
<b>any existing metadata</b> of this type in the distination file <b>will be
overwritten</b> by the new block.
<pre><span class='blk'># copy EXIF as a block between same-named JPG files in different directories</span>
exiftool -tagsfromfile SRCDIR/%f.%e -exif -ext jpg DSTDIR
<span class='blk'># copy XMP as a block from one file to another</span>
exiftool -tagsfromfile src.jpg -xmp dst.cr2
</pre></blockquote>
<a name="Q10"></a>
<p>10. <b>"How does ExifTool handle coded character sets?"</b></p>
<!-- vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv -->
<!-- NOTE: CHANGES TO FAQ 10 MUST ALSO BE REFLECTED IN ExifTool.pod! -->
<blockquote><i>[Also see <a href="#Q18">FAQ number 18</a> for help on displaying
special characters in a Windows console.]</i></blockquote>
<blockquote>Certain meta information formats allow coded character sets other
than plain ASCII. When reading, most known encodings are converted to the
external character set according to the exiftool "<code>-charset CHARSET</code>"
or <code>-L</code> option, or to UTF‑8 by default. When writing, the
inverse conversion is performed. Alternatively, special characters may be
converted to/from HTML character entities with the <code>-E</code> option.
</blockquote>
<blockquote>A distinction is made between the <b>external</b> character set
visible to the ExifTool user, and the <b>internal</b> character used to store
text in the metadata of a file. These character sets may be specified
separately as follows:
<ol><li>The <b>external</b> character set for <b>tag values</b> passed to/from
ExifTool is UTF‑8 by default, but it may be changed through any of these
command-line options:
<blockquote><code>-charset CHARSET</code> or
<code>-charset exiftool=CHARSET</code> or <code>-L</code>
</blockquote>
The encoding of <b>file and directory names</b> (eg. the <i>FILE</i> argument on
the command line) is different. By default, these names are passed straight
through to the standard C I/O routines without recoding. On Mac/Linux these
routines expect UTF‑8, but on Windows they use the system code page (which
is dependent on your system settings). However, as of ExifTool 9.79, the
external filename encoding may be specified:
<blockquote><code>-charset filename=CHARSET</code></blockquote>
When this is done, file and directory names are converted from the specified
encoding to one appropriate for system I/O routines. In Windows, this also has
the effect of enabling Unicode filename support via the special Windows
wide-character I/O routines if the required Perl modules are available
(these are included in the Windows executable version of ExifTool). See
<a href="exiftool_pod.html#WINDOWS-UNICODE-FILE-NAMES">WINDOWS UNICODE FILE NAMES</a>
in the application documentation for more details.<br><br></li>
<li>The <b>internal</b> character set for strings stored in file metadata may be
specified for some metadata types:
<blockquote><code>-charset TYPE=CHARSET</code></blockquote>
(where <code>TYPE</code> is "<code>exif</code>", "<code>iptc</code>",
"<code>id3</code>", "<code>photoshop</code>" or "<code>quicktime</code>")</li></ol>
Valid <code>CHARSET</code> values are (with aliases given in brackets, case is
not significant):
<blockquote><table class=clear>
<tr><td>UTF8</td><td>(cp65001, UTF‑8)</td><td>Thai</td><td>(cp874)</td></tr>
<tr><td>Latin</td><td>(cp1252, Latin1)</td><td>MacRoman</td><td>(cp10000, Mac, Roman)</td></tr>
<tr><td>Latin2</td><td>(cp1250)</td><td>MacLatin2</td><td>(cp10029)</td></tr>
<tr><td>Cyrillic</td><td>(cp1251, Russian) </td><td>MacCyrillic</td><td>(cp10007)</td></tr>
<tr><td>Greek</td><td>(cp1253)</td><td>MacGreek</td><td>(cp10006)</td></tr>
<tr><td>Turkish</td><td>(cp1254)</td><td>MacTurkish</td><td>(cp10081)</td></tr>
<tr><td>Hebrew</td><td>(cp1255)</td><td>MacRomanian</td><td>(cp10010)</td></tr>
<tr><td>Arabic</td><td>(cp1256)</td><td>MacIceland</td><td>(cp10079)</td></tr>
<tr><td>Baltic</td><td>(cp1257)</td><td>MacCroatian</td><td>(cp10082)</td></tr>
<tr><td>Vietnam</td><td>(cp1258)</td></tr>
</table></blockquote>
The <code>-L</code> option is equivalent to "<code>-charset Latin</code>",
"<code>-charset Latin1</code>" and "<code>-charset cp1252</code>".</blockquote>
<blockquote>Type-specific details are given below about the special character
handling for EXIF, IPTC, XMP, PNG, ID3, PDF, Photoshop, QuickTime, AIFF, RIFF,
MIE and Vorbis information:</blockquote>
<!-- NOTE: CHANGES TO FAQ 10 MUST ALSO BE REFLECTED IN ExifTool.pod! -->
<blockquote><b>EXIF</b>: Most textual information in EXIF is stored in ASCII
format (called "string" in the <a href="TagNames/index.html">ExifTool tag name
documentation</a>). By default ExifTool does not convert these strings.
However, it is not uncommon for applications to write UTF‑8 or other
encodings where ASCII is expected. To deal with these, ExifTool allows the
internal EXIF string encoding to be specified with
"<code>-charset exif=CHARSET</code>", which causes EXIF string values to be
converted from the specified character set when reading, and stored with this
character set when writing. The
<a href="http://www.metadataworkinggroup.org/">MWG</a> recommends using
UTF‑8 encoding for EXIF strings, and in keeping with this the
"<code>-use mwg</code>" feature sets the default internal EXIF string encoding
to UTF‑8 (ie. "<code>-charset exif=utf8</code>"), but note that this will
have no effect unless the external encoding is also set to something other than
the default of UTF‑8.</blockquote>
<blockquote>A few EXIF tags (UserComment, GPSProcessingMethod and
GPSAreaInformation) support a designated internal text encoding, with values
stored as ASCII, Unicode (UCS‑2) or JIS. When reading these tags, ExifTool
converts Unicode and JIS to the external character set specified by the
<code>-charset</code> or <code>-L</code> option, or to UTF‑8 by default.
ASCII text is not converted. When writing, text is stored as ASCII unless the
string contains special characters, in which case it is converted from the
external character set (UTF‑8 by default), and stored as Unicode. ExifTool
writes Unicode in native EXIF byte ordering by default, but the byte order may
be specified by setting the ExifUnicodeByteOrder tag (see the
<a href="TagNames/Extra.html">Extra Tags documentation</a>).</blockquote>
<blockquote>The EXIF "XP" tags (XPTitle, XPComment, etc) are always stored
internally as little-endian Unicode (UCS‑2), and are read and written
using the specified external character set.</blockquote>
<!-- NOTE: CHANGES TO FAQ 10 MUST ALSO BE REFLECTED IN ExifTool.pod! -->
<blockquote><b>IPTC</b><span class='sm'><sup>†</sup></span>: The
value of the IPTC:CodedCharacterSet tag determines how the internal IPTC string
values are interpreted. If CodedCharacterSet exists and has a value of
"<code>UTF8</code>" (or "<code>ESC % G</code>") then string values are
assumed to be stored as UTF‑8. Otherwise the internal IPTC encoding is
assumed to be Windows Latin1 (cp1252), but this can be changed with
"<code>-charset iptc=CHARSET</code>". When reading, these strings are converted
to UTF‑8 by default, or to the external character set specified by the
<code>-charset</code> or <code>-L</code> option. When writing, the inverse
conversions are performed. No conversion is done if the internal (IPTC) and
external (ExifTool) character sets are the same. Note that ISO 2022 character
set shifting is not supported. Instead, a warning is issued and the string is
not converted if an ISO 2022 shift code is encountered. See the
<a href="http://www.iptc.org/std/IIM/4.1/specification/IIMV4.1.pdf">IPTC IIM
specification</a> for more information about IPTC character coding.</blockquote>
<blockquote>ExifTool may be used to convert IPTC values to a different internal
encoding. To do this, all IPTC tags must be rewritten along with the desired
value of CodedCharacterSet. For example, the following command changes the
internal IPTC encoding to UTF‑8 (from Windows Latin1 unless
CodedCharacterSet was already "UTF8"):
<pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 a.jpg
</pre>or from Windows Latin2 (cp1250) to UTF‑8:
<pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset=utf8 -charset iptc=latin2 a.jpg
</pre>and this command changes it back from UTF‑8 to Windows Latin1 (cp1252):
<pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset= a.jpg
</pre>or to Windows Latin2:
<pre>exiftool -tagsfromfile @ -iptc:all -codedcharacterset= -charset iptc=latin2 a.jpg
</pre>Note that unless CodedCharacterSet is UTF‑8, applications have no
reliable way to determine the IPTC character encoding. For this reason, it is
recommended that CodedCharacterSet be set to "<code>UTF8</code>" when creating
new IPTC.</blockquote>
<blockquote class='sm'><sup>†</sup> <span class=lt>Refers to the older
<a href="http://www.iptc.org/site/News_Exchange_Formats/IIM/">IPTC IIM</a> format.
The more recent
<a href="http://iptc.cms.apa.at/site/Photo_Metadata/IPTC_Core_&_Extension/">IPTC
Core and Extension specifications</a> actually use the XMP format (see below).</span>
</blockquote>
<!-- NOTE: CHANGES TO FAQ 10 MUST ALSO BE REFLECTED IN ExifTool.pod! -->
<blockquote><b>XMP</b>: Exiftool reads XMP encoded as UTF‑8, UTF‑16
or UTF‑32, and converts them all to UTF‑8 internally. Also, all XML
character entity references and numeric character references are converted.
When writing, ExifTool always encodes XMP as UTF‑8, converting the
following 5 characters to XML character references: <code>& < > '
"</code>. By default no further conversion is performed, however the
<code>-charset</code> or <code>-L</code> option may be used used to convert
text to/from a specified external character set when reading/writing.</blockquote>
<blockquote><b>PNG</b>: <a href="TagNames/PNG.html#TextualData">PNG TextualData
tags</a> are stored as tEXt, zTXt and iTXt chunks in PNG images. The tEXt and
zTXt chunks use ISO 8859-1 encoding, while iTXt uses UTF‑8. When reading,
ExifTool converts all PNG textual data to the external character set specified
by the <code>-charset</code> or <code>-L</code> option, or to UTF‑8 by
default. When writing, ExifTool generates a tEXt chunk (or zTXt with the
<code>-z</code> option) if the text doesn't contain special characters or if
Latin encoding is specified (<code>-L</code> or <code>-charset latin</code>);
otherwise an iTXt chunk is used and the text is converted from the specified
external character set and stored as UTF‑8.</blockquote>
<blockquote><b>JPEG Comment</b>: The encoding for the JPEG Comment (COM segment)
is not specified, so ExifTool reads/writes this text without
conversion.</blockquote>
<blockquote><b>ID3</b>: The ID3v1 specification officially supports only ISO
8859‑1 encoding (a subset of Windows Latin1), although some applications
may incorrectly use other character sets. By default ExifTool converts ID3v1
text from Latin to the external character set specified by the
<code>-charset</code> or <code>-L</code> option, or to UTF‑8 by default.
However, the internal ID3v1 charset may be specified with
"<code>-charset id3=CHARSET</code>". The encoding for ID3v2 information is
stored in the file, so ExifTool converts ID3v2 text from this encoding to the
external character set specified by <code>-charset</code> or <code>-L</code>, or
to UTF‑8 by default. ExifTool does not currently write ID3
information.</blockquote>
<blockquote><b>PDF</b>: PDF text strings are stored in either PDFDocEncoding
(similar to Windows Latin1) or Unicode (UCS‑2). When reading, ExifTool
converts to the external character set specified by the <code>-charset</code> or
<code>-L</code> option, or to UTF‑8 by default. When writing, ExifTool
encodes input text from the specified character set as Unicode only if the
string contains special characters, otherwise PDFDocEncoding is
used.</blockquote>
<blockquote><b>Photoshop</b>: Some Photoshop resource names are stored as
Pascal strings with unknown encoding. By default, ExifTool assumes MacRoman
encoding and converts this to UTF‑8, but the internal and external
character sets may be specified with "<code>-charset Photoshop=CHARSET</code>"
and "<code>-charset CHARSET</code>" respectively.</blockquote>
<blockquote><b>QuickTime</b>: QuickTime text strings may be stored in a
variety of poorly documented formats, and ExifTool does its best to decode
these according to the <code>-charset</code> option setting. For some
QuickTime strings where the internal encoding is not known, ExifTool assumes
a default encoding of MacRoman, but this may be changed with
"<code>-charset QuickTime=CHARSET</code>".</blockquote>
<blockquote><b>AIFF</b>: AIFF strings are assumed to be stored in MacRoman, and
are converted according to the <code>-charset</code> option when reading.
</blockquote>
<blockquote><b>RIFF</b>: The internal encoding of RIFF strings (eg. in AVI and
WAV files) is assumed to be Latin unless otherwise specified by the RIFF CSET
chunk or the "<code>-charset RIFF=CHARSET</code>" option.
</blockquote>
<blockquote><b>MIE</b>: MIE strings are stored as either UTF‑8 or ISO
8859‑1. When reading, UTF‑8 strings are converted according to
the <code>-charset</code> or <code>-L</code> option, and ISO 8859‑1
strings are never converted. When writing, input strings are converted from
the specified character set to UTF‑8. The resulting strings are stored as
UTF‑8 if they contain multi-byte UTF‑8 character sequences,
otherwise they are stored as ISO 8859‑1.</blockquote>
<blockquote><b>Vorbis</b>: Vorbis comments are stored as UTF‑8,
and are converted to the character set specified by <code>-charset</code> or
<code>-L</code> when reading.</blockquote>
<blockquote class=prog>
<b>Programmers</b>: ExifTool returns all values as byte strings of encoded
characters. Perl wide characters are not used. The encoding is UTF‑8 by
default, but valid UTF‑8 can not be guaranteed for all values, so the
caller must validate the encoding if necessary. The encodings described above
are set by the various <a href="ExifTool.html#Charset">Charset options</a> of
the API.
<br><br><b>Note</b>: Some settings of the system PERL_UNICODE environment
variable may be incompatible with ExifTool's character handling.
</blockquote>
<!-- NOTE: CHANGES TO FAQ 10 MUST ALSO BE REFLECTED IN ExifTool.pod! -->
<!-- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -->
<a name="Q11"></a>
<p>11. <b>"My user-defined tags don't work"</b></p>
<blockquote>
For examples of how to add user-defined tags, see the
<a href="config.html">ExifTool_config</a> file in the ExifTool distribution.
It may be useful to activate this file as a test before trying to implement
your own config file. To activate this file, copy it to your <b>HOME</b>
directory then rename it to "<code>.ExifTool_config</code>".
<blockquote class=lt><b>Note</b>: The config file must be renamed at the
command line because neither the Windows nor Mac GUI allow a file name to
begin with a "<code>.</code>". To do this in Windows, run "cmd.exe" and type
the following (pressing <i>RETURN</i> at the end of each line):
<pre>cd %HOMEPATH%
rename ExifTool_config .ExifTool_config
</pre>
or on a Mac, open the "Terminal" application (from the /Applications/Utilities
folder) and type this command then press <i>RETURN</i>:
<pre>mv ExifTool_config .ExifTool_config
</pre></blockquote>
With the sample config file installed, you should be able to write the example
tags. A command like this:
<pre>exiftool -v2 -NewXMPxmpTag=test <i>FILE</i></pre>
should print this as the first line of its output:
<pre>Writing XMP-xmp:NewXMPxmpTag
</pre>
If this doesn't work, the most common problem is that the
"<code>.ExifTool_config</code>" configuration file isn't getting loaded. In
this case, there are a few things you can try:
<ol>
<li>Make sure the config file name is correct. It must be
"<code>.ExifTool_config</code>" (note the leading "<code>.</code>", and the
capital "<code>T</code>").</li>
<li>Set either the <b>HOME</b> or the <b>EXIFTOOL_HOME</b> environment variable
to the name of the directory where you put your "<code>.ExifTool_config</code>"
file.</li>
<li>Put the config file in the same directory as the exiftool script. (Also, be
sure the config filename starts with a dot! See the note above for help
renaming the config file.)</li>
<li>If you can't get the config file to load automatically, you can try loading
it manually with the exiftool <code>-config <i>CFGFILE</i></code> option. (Note:
This must be the first option on the command line.) This allows loading
of a config file with any name.</li>
</ol>
</blockquote>
<blockquote>If necessary, you can verify that ExifTool is loading your config
file by adding the following line to your file:
<pre>print "LOADED!\n";
</pre>
If you see a "<code>LOADED!</code>" message when you run exiftool, but your new
tags still don't work, make sure you are using the proper tag name and that the
file you are writing can support this type of information.</blockquote>
<blockquote>Note that all tag names in the config file are <b>case
sensitive</b>. Specifically, the case must be correct for tag names in
Composite tag Require/Desire entries. Also note that XMP tag names are
generated automatically by capitalizing the tag ID unless the tag definition
contains a "Name" entry.</blockquote>
<blockquote class=prog><b>Programmers</b>: To specify the config file directory from within
a Perl script when using the ExifTool API, set the <b>EXIFTOOL_HOME</b>
environment variable before loading the ExifTool module:
<pre>BEGIN { $ENV{EXIFTOOL_HOME} = '/config_file_directory' }
use Image::ExifTool;
</pre>
Also see the <a href="ExifTool.html#Config">Configuration section of the
ExifTool API documentation</a> for techniques to use a config file with another
name, or to disable the config file feature.
</blockquote>
<a name="Q12"></a>
<p>12. <b>"How do I export information from exiftool to a database?"</b></p>
<blockquote><i>[See <a href="#Q26">FAQ number 26</a> for help with the reverse
-- importing metadata from a database.]</i></blockquote>
<blockquote>
It is often easiest to export information formatted as a tab-delimited or
comma-separated list of values using the exiftool <code>-T</code> or
<code>-csv</code> option. As well, the <code>-r</code> option is useful for
recursing through all images in a hierarchy of directories. For example:
<pre>exiftool -T -r -filename -exposuremode -ISO t/images > out.txt
</pre>
This command recursively processes all images in the "<code>t/images</code>"
directory, extracting FileName, ExposureMode and ISO tags, and writing the
output to a tab-delimited text file called "<code>out.txt</code>". After the
command has executed, "<code>out.txt</code>" will look something like this:
<pre>Canon.jpg Manual 100
Casio.jpg - 64
Nikon.jpg - 100
OlympusE1.jpg Auto 400
</pre>
One limitation of the <code>-T</code> option is that a list of tags to extract
must be specified. Otherwise, all information is extracted from each input
file, and the columns would contain values from random tags.</blockquote>
<blockquote> The <code>-csv</code> (comma separated values) option solves this
dilemma by pre-extracting information from all input files, then producing a
sorted list of available tag names as the first row of the output, and
organizing the information into columns for each tag. As well, a first column
labelled "SourceFile" is generated. These features make it practical to use the
<code>-csv</code> option for extracting all information from multiple images.
For example, this command:
<pre>exiftool -csv -r t/images > out.csv</pre>
gives an output like this:
<pre>SourceFile,AEBBracketValue,AELock,AFAreaHeight,AFAreaMode,AFAreas,[...]
t/images/Canon.jpg,0,,151,,,[...]
t/images/Casio.jpg,,,,,,[...]
t/images/Nikon.jpg,,,,Single Area,,[...]
t/images/OlympusE1.jpg,,Off,,,"Center (121,121)-(133,133)",[...]
</pre>
Note that the number of columns in the <code>-csv</code> output may be very
large if all information is extracted. Missing tags are indicated by empty
strings as in the example above, or by dashes if the <code>-f</code> option is
used.</blockquote>
<blockquote> It should be possible to import these files directly into most
database applications. On the command line, any list of tag names may be used,
and any number of file or directory names may be specified. (Hint: If your
command line starts to get too long, you may want to look into using the
<code>-@</code> option and/or the <a href="index.html#shortcut">ShortCut</a>
feature).</blockquote>
<blockquote>In Windows, a .BAT file containing the exiftool command may be used
to give drag and drop functionality. Dropping a folder on the following .BAT
file will create "out.txt" in the folder:
<pre>echo "FileName<tab>Aperture<tab>ISO" > %1\out.txt
exiftool -T -r -filename -aperture -ISO %1 >> %1\out.txt
</pre>
The "<code>echo</code>" command was included to add column headings to the
output. (The tab character in the echo command, indicated by
"<code><tab></code>", may be generated in Mac/Linux shells with CTRL-v
then TAB, or in a Windows cmd shell with TAB when cmd.exe is run with the
<code>/f:off</code> option to disable tab completion.)
</blockquote>
<blockquote>Other possible export formats include RDF/XML (with the the
<code>-X</code> option), or JSON (with the <code>-j</code> option). These
methods allow transfer of more complex data sets (including structured
information with the <code>-struct</code> option), but require that the
importing software supports these formats.</blockquote>
<blockquote>Finally, the <code>-p</code> option may be used to generate any
arbitrary output format. For example, the following format file
(let's call it "<code>my.fmt</code>") may be used to emulate a CSV-formatted
output:
<pre>#[HEAD]FileName, Aperture, ISO
$filename, $aperture, $iso
</pre>
with a command like this:
<pre>exiftool -f -r -p my.fmt t/images > out.csv
</pre>
Alternatively, the <code>-p</code> option may be used with a format string instead
of a file name. The following command has the same effect as above except that
the row of headings is not printed (Note: Use single quotes as below on Mac/Linux,
or double quotes instead on Windows):
<pre>exiftool -f -r -p '$filename, $aperture, $iso' t/images > out.csv
</pre>
With the <code>-f</code> option, the value of any missing tag is printed as a
dash. Without this option, missing tags generate a minor warning and the
line in the <code>-p</code> output is not printed. The <code>-m</code> option
may be used to ignore minor warnings, which causes these lines to be printed
with an empty value for missing tags.</blockquote>
<blockquote>
See the <code>-p</code> option in the <a href="exiftool_pod.html">application
documentation</a> for more information about this feature.
</blockquote>
<a name="Q13"></a>
<p>13a. <b>"Why is my file smaller after I use ExifTool to write information?"</b>, or
<br>13b. <b>"Why do some Offset tags change value when I write other tags?"</b>, or
<br>13c. <b>"How does editing a file with ExifTool affect image quality?"</b></p>
<blockquote>
There are various specific reasons why this can happen, but the general answer
is: When ExifTool writes an image, the meta information may be restructured in
such a way that it takes less space than in the original file, or so that some
tags are stored at different offsets in the file.</blockquote>
<blockquote>The EXIF/TIFF standard allows for blocks of unreferenced data to
exist in an image. Some digital cameras write JPEG or TIFF-based RAW files
which contain large blocks of unused data, usually filled with binary zeros.
The reason for this could be to simplify camera algorithms by allowing
variable-sized information to be written at fixed offsets in the output image.
When ExifTool rewrites an image it does not copy these unused blocks. This can
result in a significant reduction in file size for some images. <i>[The
<code>-htmlDump</code> option may be used to view the file structure if you are
interested in seeing these unused data blocks -- use a command like
"<code>exiftool -htmlDump a.jpg > out.html</code>", then open
<code>out.html</code> in your web browser. Unused data blocks are
<span class=U>brown</span> in this output.]</i> </blockquote>
<blockquote>Also, the size of an XMP record may easily shrink or grow when it is
rewritten, even if no meta information is changed. This is partly due to the
fact that the XMP specification recommends a few KB of padding at the end of the
record (ExifTool adds 2424 bytes by default, but this padding is omitted if the
<code>-z</code> option is used), and partly due to the flexibility of the XMP
format which allows the information to be written in various styles, some of
which are more compact than others.
</blockquote>
<blockquote>You may also notice that the values of some "offset" tags (like
ThumbnailOffset and PreviewImageStart) may change when the file is rewritten.
This is normal, and simply indicates that the associated data is now stored at a
different position within the file.</blockquote>
<blockquote>ExifTool does not modify the image data itself, so <b>editing a file
with ExifTool is "lossless" as far as the image is concerned</b>.</blockquote>
<a name="Q14"></a>
<p>14a. <b>"What format do I use for writing GPS coordinates?"</b>, or<br>
14b. <b>"How do I change the format of extracted GPS coordinates?"</b></p>
<blockquote>ExifTool is very flexible in the formats allowed for entering GPS
coordinates. Any string containing between 1 and 3 floating point numbers is
valid. The numbers represent degrees, (and optionally) minutes and
seconds.</blockquote>
<blockquote>For EXIF GPS coordinates, the reference direction is specified
separately with the EXIF:GPSLatitudeRef or EXIF:GPSLongitudeRef
tag.</blockquote>
<blockquote>For XMP GPS coordinates, the reference direction is specified within
the XMP:GPSLatitude or XMP:GPSLongitude value, with west longitudes and south
latitudes being specified either by negative coordinate values or by ending the
string with "<code>W</code>" or "<code>S</code>". </blockquote>
<blockquote>Here are some examples of equivalent ways to specify a GPS
latitude in both EXIF and XMP:
<pre>exiftool -exif:gpslatitude="42 30 0.00" -exif:gpslatituderef=S a.jpg
exiftool -exif:gpslatitude="42 deg 30.00 min" -exif:gpslatituderef=S a.jpg
exiftool -exif:gpslatitude=42.5 -exif:gpslatituderef=S a.jpg
exiftool -xmp:gpslatitude="42 30 0.00 S" a.jpg
exiftool -xmp:gpslatitude=42.50S a.jpg
exiftool -xmp:gpslatitude=-42.5 a.jpg
</pre>
Similar styles may be used for longitude. ExifTool will convert any of these
coordinate styles to the proper format for the specific tag used.
</blockquote>
<blockquote>When reading, ExifTool reports coordinates in the format
<pre>DDD deg MM' SS.SS"</pre>
where <code>DDD</code> is degress, <code>MM</code> is minutes, and <code>SS.SS</code>
is seconds. The <code>-n</code> option may be used to change this to decimal
degrees, or any arbitrary format may be specified with the <code>-c</code> option.
See the <a href="exiftool_pod.html">application documentation</a> for details.
</blockquote>
<a name="Q15"></a>
<p>15. <b>"I get MakerNote warnings or errors when reading or writing information"</b></p>
<blockquote>Problems like this may be caused by image editing software which
doesn't properly update offsets in the MakerNotes when rewriting an image. These
offsets are used as pointers to reference tag values and structures within the
metadata, and errors like this may lead to missing or incorrect values for some
MakerNotes tags. In many cases, ExifTool will detect this type of problem and
issue a warning like this when reading (or an error when writing):
<pre>Warning: [minor] Possibly incorrect maker notes offsets (fix by -340?)
</pre>
<i class=lt>[Be aware that if multiple warnings occur, the <code>-a</code>
option must be used to see them all, since by default only one warning is
displayed per file.]</i> </blockquote>
<blockquote>This is a particularly insidious problem that is sometimes difficult
for ExifTool to correct automagically, so it requires some operator
intervention. If this warning occurs, you have a few alternatives:</blockquote>
<blockquote>1) Use the <code>-F</code> option to allow ExifTool to attempt to
fix the incorrect offsets. If ExifTool was correct in its diagnosis, then this
option will fix the incorrect offsets. This is usually the appropriate choice
if this problem was caused by editing the image with other
software.</blockquote>
<blockquote>2) Use the <code>-m</code> option to ignore the warning (or downgrade
the error to a warning when writing). This causes ExifTool to honour the
existing maker note offsets, and may be the correct choice if images straight
out of the camera have this problem.</block