Project

General

Profile

The Metadata in TIFF files » History » Version 3

Robin Mills, 12 Nov 2016 16:57

1 1 Robin Mills
h1. The Metadata in TIFF files
2
3
The Tagged Image File Format is a container.  It's very flexible and can deal with multiple pages, different colour spaces, frame configurations as well as metadata.  The specification is available from:  https://partners.adobe.com/public/developer/en/tiff/TIFF6.pdf
4
5 3 Robin Mills
!Tiff.png!
6
7 1 Robin Mills
The format is quite simple and consists of a fixed format header (of 8 bytes) which provides the offset of a directory of records.  A directory has a two byte header which contains the length of the directory followed by 12 byte records or "tags".  The final entry in the directory is always the offset to the next dictionary.  A dictionary of length == 0 terminates the directory chain.
8
9
A tag consists of a 12 byte record: Tag, Type, Count, Offset which are 2,2,4 and 4 bytes respectively.  The Tag defines the purpose of the record (Width, Height, ColorSpace etc) and the Type defines the nature of the data.  Count and Offset are used to contain the data, or provide an offset in the file at which to read the raw data for this tag.
10
11
This is all very well described in the specification.  The code in tiff image.cpp/ TiffImage::printStructure() decodes the dictionaries.
12
13
The TIFF container is so flexible it is used as the structure for most RAW formats including Adobe's DNG.  Additionally the TIFF contain is used to store the metadata that lies inside the Exif and Iptc data blocks within JPEG and PNG files.
14
15
*Example:*
16
The version of exiv2(.exe) which ships with v0.25 provides options -pS to reveal the structure of the TIFF and option -pX is used to extract the raw XMP/xml data.  The option -pa is used to print the metadata in human readable format.<pre>$ exiv2 -pa ~/tif
17
Exif.Image.ImageWidth                        Short       1  40
18
Exif.Image.ImageLength                       Short       1  470
19
Exif.Image.BitsPerSample                     Short       3  8 8 8
20
Exif.Image.Compression                       Short       1  LZW
21
Exif.Image.PhotometricInterpretation         Short       1  RGB
22
Exif.Image.StripOffsets                      Long        1  2694
23
Exif.Image.Orientation                       Short       1  right, top
24
Exif.Image.SamplesPerPixel                   Short       1  3
25
Exif.Image.RowsPerStrip                      Short       1  1092
26
Exif.Image.StripByteCounts                   Long        1  5086
27
Exif.Image.PlanarConfiguration               Short       1  1
28
Exif.Image.Predictor                         Short       1  Horizontal differencing
29
Exif.Image.SampleFormat                      Short       3  Unsigned integer data
30
Exif.Image.XMLPacket                         Byte      2500  (Binary value suppressed)
31
Xmp.dc.title                                 LangAlt     1  lang="x-default" this is a title
32
/Users/rmills/tif: (No IPTC data found in the file)
33
$ exiv2 -pS ~/tif
34
STRUCTURE OF TIFF FILE: /Users/rmills/tif
35
 address |    tag                      |      type |    count |   offset | value
36
      10 | 0x0100 ImageWidth           |     SHORT |        1 |  2621440 | 40
37
      22 | 0x0101 ImageLength          |     SHORT |        1 | 30801920 | 470
38
      34 | 0x0102 BitsPerSample        |     SHORT |        3 |      182 | 
39
      46 | 0x0103 Compression          |     SHORT |        1 |   327680 | 5
40
      58 | 0x0106 PhotometricInterpret |     SHORT |        1 |   131072 | 2
41
      70 | 0x0111 StripOffsets         |      LONG |        1 |     2694 | 0
42
      82 | 0x0112 Orientation          |     SHORT |        1 |   393216 | 6
43
      94 | 0x0115 SamplesPerPixel      |     SHORT |        1 |   196608 | 3
44
     106 | 0x0116 RowsPerStrip         |     SHORT |        1 | 71565312 | 1092
45
     118 | 0x0117 StripByteCounts      |      LONG |        1 |     5086 | 0
46
     130 | 0x011c PlanarConfiguration  |     SHORT |        1 |    65536 | 1
47
     142 | 0x013d Predictor            |     SHORT |        1 |   131072 | 2
48
     154 | 0x0153 SampleFormat         |     SHORT |        3 |      188 | 
49
     166 | 0x02bc XMLPacket            |      BYTE |     2500 |      194 | <?xpacket begin="..." id="W5M0Mp ...
50
$ exiv2 -pX ~/tif | xmllint -pretty 1 -
51
<?xml version="1.0"?>
52
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
53
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0-Exiv2">
54
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
55
    <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="">
56
      <dc:title>
57
        <rdf:Alt>
58
          <rdf:li xml:lang="x-default">this is a title</rdf:li>
59
        </rdf:Alt>
60
      </dc:title>
61
    </rdf:Description>
62
  </rdf:RDF>
63
</x:xmpmeta>
64
<?xpacket end="w"?>
65
855 rmills@rmillsmbp:~/Documents/exiv2 $ </pre>
66
67 2 Robin Mills
You can clearly see the XMLPacket is stored at offset 194 into the file and consists of 2500 bytes.   You can of course directly extract the XMP with the following command which says:  set the block size to 1 byte, skip 194 bytes and dump the next 2500 bytes:<pre>863 rmills@rmillsmbp:~/Documents/exiv2 $ dd bs=1 skip=194 count=2500 if=~/tif  | xmllint -pretty 1 -
68 1 Robin Mills
2500+0 records in
69
2500+0 records out
70
2500 bytes transferred in 0.005714 secs (437526 bytes/sec)
71
<?xml version="1.0"?>
72
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
73
<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="XMP Core 4.4.0-Exiv2">
74
  <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
75
    <rdf:Description xmlns:dc="http://purl.org/dc/elements/1.1/" rdf:about="">
76
      <dc:title>
77
        <rdf:Alt>
78
          <rdf:li xml:lang="x-default">this is a title</rdf:li>
79
        </rdf:Alt>
80
      </dc:title>
81
    </rdf:Description>
82
  </rdf:RDF>
83
</x:xmpmeta>
84
<?xpacket end="w"?>
85
864 rmills@rmillsmbp:~/Documents/exiv2 $ </pre>The option -pX doesn't actually use dd to achieve the same result and is much more convenient to use.
86 2 Robin Mills
87
To demonstrate that the metadata block in a JPEG is a TIFF file, extract and print the structure.<pre>$ exiv2 -pS ~/jpg 
88
STRUCTURE OF JPEG FILE: /Users/rmills/jpg
89
 address | marker     | length  | data
90
       2 | 0xd8 SOI  
91
       4 | 0xe1 APP1  |   14862 | Exif..II*.....................
92
   14868 | 0xe1 APP1  |    2720 | http://ns.adobe.com/xap/1.0/.<
93
   17590 | 0xed APP13 |     110 | Photoshop 3.0.8BIM.......6....
94
   17702 | 0xe2 APP2  |    4094 | MPF.II*...............0100....
95
   21798 | 0xdb DQT   |     132 
96
   21932 | 0xc0 SOF0  |      17 
97
   21951 | 0xc4 DHT   |     418 
98
   22371 | 0xda SOS   |      12 
99
$ dd bs=1 skip=12 count=14862 if=~/jpg of=bull.tif
100
14862+0 records in
101
14862+0 records out
102
14862 bytes transferred in 0.038783 secs (383211 bytes/sec)
103
$ exiv2 -pS bull.tif
104
STRUCTURE OF TIFF FILE: bull.tif
105
 address |    tag                      |      type |    count |   offset | value
106
      10 | 0x010f Make                 |     ASCII |       18 |      134 | NIKON CORPORATION.
107
      22 | 0x0110 Model                |     ASCII |       12 |      152 | NIKON D5300.
108
      34 | 0x0112 Orientation          |     SHORT |        1 |        1 | 1
109
      46 | 0x011a XResolution          |  RATIONAL |        1 |      164 | 
110
      58 | 0x011b YResolution          |  RATIONAL |        1 |      172 | 
111
      70 | 0x0128 ResolutionUnit       |     SHORT |        1 |        2 | 2
112
      82 | 0x0131 Software             |     ASCII |       10 |      180 | Ver.1.00 .
113
      94 | 0x0132 DateTime             |     ASCII |       20 |      190 | 2015:02:13 20:46:51.
114
     106 | 0x0213 YCbCrPositioning     |     SHORT |        1 |        1 | 1
115
     118 | 0x8769 ExifTag              |      LONG |        1 |      210 | 210
116
    4080 | 0x0103 Compression          |     SHORT |        1 |        6 | 6
117
    4092 | 0x011a XResolution          |  RATIONAL |        1 |     4168 | 
118
    4104 | 0x011b YResolution          |  RATIONAL |        1 |     4176 | 
119
    4116 | 0x0128 ResolutionUnit       |     SHORT |        1 |        2 | 2
120
    4128 | 0x0201 JPEGInterchangeForma |      LONG |        1 |     4184 | 4184
121
    4140 | 0x0202 JPEGInterchangeForma |      LONG |        1 |    10670 | 10670
122
    4152 | 0x0213 YCbCrPositioning     |     SHORT |        1 |        1 | 1
123
$ </pre>