Under the Hood

Overview
Value Conversions
Underlying Philosophies

# "Under the Hood" of ExifTool

This page is a work in progress, and will be used to explain some details of ExifTool's inner workings.

## Overview of ExifTool

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.

The information flow is separated into two distinct modes: 1) Reading or extracting information, and 2) Writing or editing. The application runs in read mode by default, but switches to write mode if a new value is assigned to any tag (via "`-TAG=`", "`-tagsFromFile`", "`-geotag`", "`-csv=`" or "`-json=`" on the command line).

## Value Conversions

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 ("PrintConv") value, but other levels are exposed through various exiftool options:

3. The "PrintConv" 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 `-lang` (Lang) option is used to specify the language for this conversion, and the `-c` and `-d` (CoordFormat and DateFormat) options specify this formatting for GPS coordinates and date/time values.

2. The "ValueConv" value is a numerical value, suitable for use in calculations. Typically, this value is converted to standard units (ie. degrees, meters, or seconds) to make calculations simpler. This value is returned for all tags when the `-n` option is used, or for individual tags by suffixing the tag name with a `#` character.

1. The "Raw" 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. This value may be seen by using the `-v` option.

0. The "Binary" value is actual binary data stored in the file. This data is displayed in hexadecimal form with the `-v3` option, or by using the `-htmlDump` feature. Note that this value is not related to the `-b` (`-binary`) 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 Tag Name documentation gives the format of this binary data for writable tags.

Below are some examples of these different values for a few tags:

> Tag | 3. PrintConv | 2. ValueConv | 1. Raw | 0. Binary
> --- | --- | --- | --- | ---
> Orientation | Horizontal (normal) | 1 | 1 |
>     00 01
> GPSLatitude | 45 deg 20' 11.00" | 45.3363888888889 | 45 20 11 (45/1 20/1 11/1) |
>     00 00 00 2d 00 00 00 01
>     00 00 00 14 00 00 00 01
>     00 00 00 0b 00 00 00 01
> ExposureTime | 1/30 | 0.03333333333 | 0.03333333333 (1/30) |
>     00 00 00 01 00 00 00 1e
> ShutterSpeedValue | 1/30 | 0.0333333334629176 | 4.90689059 (19868/4049) |
>     00 00 4d 9c 00 00 0f d1

## Underlying Philosophies

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.

In the design of exiftool, there have been a number of underlying philosophies which have helped to influence the overall development:

1. Make Image::ExifTool 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.)
2. Keep the interface simple for simple tasks (sometimes at the expense of making it more complicated for complex tasks).
3. The API functions should be isolated from the details of the metadata formats (otherwise the interface turns into a giant hairball, like the metadata).
4. Maintain flexibility to allow users the freedom to do what they want.
5. Design the code to be efficient for batch processing, even if it increases the initial overhead.
6. 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.
7. If possible, recognize file types by their structure, not by their extension.
8. Maintain backward compatibility when making changes to the ExifTool API or command line application.

Created Jun. 24, 2009
Last revised Dec. 24, 2013

<-- Back to ExifTool home page