You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
8.8 KiB
166 lines
8.8 KiB
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
|
|
"http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>Under the Hood</title>
|
|
<link rel=stylesheet type='text/css' href='style.css' title='Style'>
|
|
<style type="text/css">
|
|
<!--
|
|
pre { margin: 0 }
|
|
ol.index { margin: 0; padding: 0 0 0 2em }
|
|
-->
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class='index'>
|
|
<a href="#overview">Overview</a>
|
|
<br><a href="#conversions">Value Conversions</a>
|
|
<br><a href="#philophies">Underlying Philosophies</a>
|
|
<br><a href="#perl">Why Perl?</a>
|
|
</div>
|
|
|
|
<h1 class='up'>"Under the Hood" of ExifTool</h1>
|
|
|
|
<p>This page explains some details of ExifTool's inner workings.</p>
|
|
|
|
<a name="overview"></a>
|
|
<h2>Overview of ExifTool</h2>
|
|
|
|
<p>Below is a diagram showing the flow of information for the exiftool
|
|
application. Indicated outside the boxes on the diagram are some command-line
|
|
options associated with the various stages of processing. All of these options
|
|
are directly associated with options or function calls available via the API
|
|
(Application Programming Interface), with the exception of the output text
|
|
formatting which is handled at the application level.</p>
|
|
|
|
<center><img src="overview.png" alt="ExifTool Overview" width="680" height="460"></center>
|
|
|
|
<p>The information flow is separated into two distinct modes: 1)
|
|
<span class=blu>Reading or extracting information</span>, and 2)
|
|
<span class=red>Writing or editing</span>. The application runs in
|
|
<b class=blu>read</b> mode by default, but switches to <b class=red>write</b> mode
|
|
if a new value is assigned to any tag (via "<code>-TAG=</code>",
|
|
"<code>-tagsFromFile</code>", "<code>-geotag</code>", "<code>-csv=</code>" or
|
|
"<code>-json=</code>" on the command line).</p>
|
|
|
|
<a name="conversions"></a>
|
|
<h2>Value Conversions</h2>
|
|
<p>When ExifTool reads or writes the value of a tag, there are 3 separate
|
|
conversions applied to each value, resulting in 4 different levels for the value
|
|
of each tag. By default, users interact only with the human-readable
|
|
("<b>PrintConv</b>") value, but other levels are exposed through various exiftool
|
|
options:</p>
|
|
|
|
<ol start=3><li>The "<b>PrintConv</b>" value is the final human-readable value
|
|
which has been converted for display. Often, the "PrintConv" conversion will
|
|
translate numbers into words for better readability. The <code>-lang</code>
|
|
(Lang) option is used to specify the language for this conversion, and the
|
|
<code>-c</code> and <code>-d</code> (CoordFormat and DateFormat) options specify
|
|
this formatting for GPS coordinates and date/time values.</li></ol>
|
|
|
|
<ol start=2><li>For numerical values, the "<b>ValueConv</b>" value is a
|
|
machine-readable value suitable for use in calculations, typically converted to
|
|
standard units (eg. degrees, meters, or seconds). For date/time values the
|
|
standard EXIF date/time format is used ("YYYY:mm:dd HH:MM:SS" plus decimal
|
|
seconds and time zone if they exist). For tags which are a closed choice of
|
|
string, this is the stored value of the string. The ValueConv value is
|
|
returned for all tags when the <code>-n</code> option is used, or for individual
|
|
tags by suffixing the tag name with a <code>#</code> character.</li></ol>
|
|
|
|
<ol start=1><li>The "<b>Raw</b>" value is the value after initial formatting is
|
|
applied to the binary data from the file. Most tags have no separate "ValueConv"
|
|
conversion, so for these tags the "Raw" value is the same as the "ValueConv"
|
|
value. Values stored in rational form also have a "<b>Rational</b>" value. Both
|
|
Raw and Rational values may be seen by using the <code>-v</code> option.</li></ol>
|
|
|
|
<ol start=0><li>The "<b>Binary</b>" value is the actual binary data stored in the
|
|
file. This data is displayed in hexadecimal form with the <code>-v3</code>
|
|
option, or by using the <code>-htmlDump</code> feature. Note that this value is
|
|
not related to the <code>-b</code> (<code>-binary</code>) option, which actually
|
|
returns the "ValueConv" value and is used for tags where this value can not be
|
|
presented in a simple text format. The Writable column in the
|
|
<a href="TagNames/index.html">Tag Name documentation</a>
|
|
gives the format of this binary data for writable tags.</li></ol>
|
|
|
|
<p>Below are some examples of these different values for a few tags:</p>
|
|
|
|
<blockquote><table class=norm>
|
|
<tr><th>Tag</th><th>3. PrintConv</th><th>2. ValueConv</th><th>1. Raw (Rational)</th><th>0. Binary</th></tr>
|
|
<tr align='center'><td>EXIF:Orientation</td><td>Horizontal (normal)</td><td>1</td><td>1</td><td><pre>00 01</pre></td></tr>
|
|
<tr align='center'><td>EXIF:GPSLatitude</td><td>45 deg 20' 11.00"</td><td>45.3363888888889</td><td>45 20 11<br>(45/1 20/1 11/1)</td>
|
|
<td><pre>00 00 00 2d 00 00 00 01<br>00 00 00 14 00 00 00 01<br>00 00 00 0b 00 00 00 01</pre></td></tr>
|
|
<tr align='center'><td>XMP:GPSLatitude</td><td>45 deg 20' 11.00"</td><td>45.3363888888889</td><td>45,20.183333N</td>
|
|
<td>"45,20.183333N"</td></tr>
|
|
<tr align='center'><td>EXIF:ExposureTime</td><td>1/30</td><td>0.03333333333</td><td>0.03333333333<br>(1/30)</td>
|
|
<td><pre>00 00 00 01 00 00 00 1e</pre></td></tr>
|
|
<tr align='center'><td>EXIF:ShutterSpeedValue</td><td>1/30</td><td>0.0333333334629176</td><td>4.90689059<br>(19868/4049)</td>
|
|
<td><pre>00 00 4d 9c 00 00 0f d1</pre></td></tr>
|
|
<tr align='center'><td>EXIF:ModifyDate</td><td>(set by <code>-d</code> option)</td><td>2016:11:25 11:56:39</td><td>2016:11:25 11:56:39</td>
|
|
<td>"2016:11:25 11:56:39\0"</td></tr>
|
|
<tr align='center'><td>XMP:ModifyDate</td><td>(set by <code>-d</code> option)</td><td>2016:11:25 11:56:39.00-05:00</td><td>2016-11-25T11:56:39.00-05:00</td>
|
|
<td>"2016-11-25T11:56:39.00-05:00"</td></tr>
|
|
</table></blockquote>
|
|
|
|
<a name="philophies"></a>
|
|
<h2>Underlying Philosophies</h2>
|
|
|
|
<p>You have the right to know about the metadata contained in your images. A main
|
|
goal of the Exiftool project is to make this information freely available, both to
|
|
the general public and as a resource for other developers.</p>
|
|
|
|
<p>In the design of exiftool, there have been a number of underlying philosophies
|
|
which have helped to influence the overall development:</p>
|
|
|
|
<ol>
|
|
<li>Make <a href="ExifTool.html">Image::ExifTool</a> as independent as possible
|
|
from other libraries to make it portable and easy to install. (Portable to
|
|
a wide range of systems and Perl versions.)</li>
|
|
<li>Keep the interface simple for simple tasks (sometimes at the expense of making
|
|
it more complicated for complex tasks).</li>
|
|
<li>The <a href="ExifTool.html#Methods">API functions</a> should be isolated from
|
|
the details of the metadata formats (otherwise the interface turns into a giant
|
|
hairball, like the metadata).</li>
|
|
<li>Maintain flexibility to allow users the freedom to do what they want
|
|
(eg. support user-defined tags).</li>
|
|
<li>Design the code to be efficient for batch processing, even if it increases the
|
|
initial overhead.</li>
|
|
<li>When writing files, remember 3 things: 1) data integrity, 2) data integrity, and
|
|
3) data integrity. If you can't do it right, don't do it at all.</li>
|
|
<li>If possible, recognize file types by their structure, not by their extension.</li>
|
|
<li>Maintain backward compatibility when making changes to the ExifTool API or
|
|
command line application.</li>
|
|
</ol>
|
|
|
|
<a name="perl"></a>
|
|
<h2>Why Write ExifTool in Perl?</h2>
|
|
|
|
<p>At the start of ExifTool development, Perl, Python and C++ were all considered as
|
|
possible languages for the project. It was recognized that the project would require
|
|
considerable effort, and the choice of language could heavily influence the amount of
|
|
work necessary. Python was a strong contender, but was discounted due to a personal
|
|
preference for C-like syntax. Perl was chosen over C++ for the main reason that
|
|
it would be less work to develop and support the project. Looking back, this was
|
|
definitely the right choice, and there was the added benefit of a strong
|
|
infrastructure in support of
|
|
<a href="http://www.cpantesters.org/distro/I/Image-ExifTool.html">testing</a> and
|
|
<a href="https://metacpan.org/release/Image-ExifTool">distributing</a> Perl software.</p>
|
|
|
|
<p>Perl 5 is very mature and extremely stable, so there is almost zero time wasted
|
|
dealing with compilation issues. Compare this to C++, where a majority of
|
|
development time for a large project may be spent in this area. Also, Perl's
|
|
built-in regular expressions are fantastically useful for all of the string
|
|
manipulations necessary for a metadata library. The biggest problem with Perl is
|
|
its lack of support for Windows Unicode file names.</p>
|
|
|
|
<p>The bottom line is that most of the development time is spent dealing with the
|
|
mechanics of metadata, with the result that ExifTool is full-featured metadata
|
|
library. With one main developer (Phil Harvey) and 280 thousand lines of code (as of
|
|
May 2023), this is a real accomplishment.</p>
|
|
|
|
<hr>
|
|
<i>Created Jun 24, 2009</i><br>
|
|
<i>Last revised May 3, 2023</i>
|
|
<p class='lf'><a href="index.html"><-- Back to ExifTool home page</a></p>
|
|
</body>
|
|
</html>
|