The Metadata in TIFF files » History » Version 4
Robin Mills, 12 Nov 2016 17:09
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 | 4 | Robin Mills | A tag consists of a 12 byte record: TagID, TagType, Count and Offset which are 2,2,4 and 4 bytes respectively. The TagID defines the purpose of the record (Width, Height, ColorSpace etc) and the TagType defines the data format. 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 | 1 | Robin Mills | |
11 | This is all very well described in the specification. The code in tiff image.cpp/ TiffImage::printStructure() decodes the dictionaries. |
||
12 | |||
13 | 4 | Robin Mills | The TIFF container is so flexible it is used as the structure for most RAW formats including Adobe's DNG. Additionally the TIFF container is used to store the metadata that lies inside the Exif blocks embedded in JPEG and PNG files. |
14 | 1 | Robin Mills | |
15 | *Example:* |
||
16 | 4 | Robin Mills | The version of exiv2(.exe) which ships with v0.25 provides options _*<code>-pS</code>*_ to reveals the structure of the TIFF and option _*<code>-pX</code>*_ 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 | 1 | Robin Mills | 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 | 4 | Robin Mills | 864 rmills@rmillsmbp:~/Documents/exiv2 $ </pre>The option _*<code>-pX</code>*_ 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 | 1 | Robin Mills | 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 | 4 | Robin Mills | $ </pre>The version of the exiv2 command-line program that ships with v0.26 later has an option _*<code>-pR</code>*_ with recursively prints the structure of an image file. By *_recursive*_ we mean the utility will print the structure of structures while reside inside other structures. For example, the Exif metadata in a JPEG is a encoded as a TIFF embedded in the file. <pre>543 rmills@rmillsmbp:~/gnu/exiv2/trunk $ exiv2 -pR test/data/Reagan.jpg |
124 | STRUCTURE OF JPEG FILE: test/data/Reagan.jpg |
||
125 | address | marker | length | data |
||
126 | 0 | 0xffd8 SOI |
||
127 | 2 | 0xffe1 APP1 | 5718 | Exif..MM.*...................... |
||
128 | STRUCTURE OF TIFF FILE (MM): MemIo |
||
129 | address | tag | type | count | offset | value |
||
130 | 10 | 0x0100 ImageWidth | SHORT | 1 | 13107200 | 200 |
||
131 | 22 | 0x0101 ImageLength | SHORT | 1 | 8519680 | 130 |
||
132 | 34 | 0x0102 BitsPerSample | SHORT | 4 | 242 | 8 8 8 8 |
||
133 | 46 | 0x0103 Compression | SHORT | 1 | 65536 | 1 |
||
134 | 58 | 0x0106 PhotometricInterpretation | SHORT | 1 | 131072 | 2 |
||
135 | 70 | 0x010e ImageDescription | ASCII | 403 | 250 | 040621-N-6536T-062.USS Ronald Re ... |
||
136 | 82 | 0x010f Make | ASCII | 18 | 653 | NIKON CORPORATION |
||
137 | 94 | 0x0110 Model | ASCII | 10 | 671 | NIKON D1X |
||
138 | 106 | 0x0112 Orientation | SHORT | 1 | 65536 | 1 |
||
139 | 118 | 0x0115 SamplesPerPixel | SHORT | 1 | 262144 | 4 |
||
140 | 130 | 0x011a XResolution | RATIONAL | 1 | 681 | 681/0 |
||
141 | 142 | 0x011b YResolution | RATIONAL | 1 | 689 | 689/0 |
||
142 | 154 | 0x011c PlanarConfiguration | SHORT | 1 | 65536 | 1 |
||
143 | 166 | 0x0128 ResolutionUnit | SHORT | 1 | 131072 | 2 |
||
144 | 178 | 0x0131 Software | ASCII | 40 | 697 | Adobe Photoshop Elements 12.0 Ma ... |
||
145 | 190 | 0x0132 DateTime | ASCII | 20 | 737 | 2016:09:13 11:58:16 |
||
146 | 202 | 0x013b Artist | ASCII | 34 | 757 | Photographer..s Mate 3rd Class ( ... |
||
147 | 214 | 0x8769 ExifTag | LONG | 1 | 792 | 792 |
||
148 | STRUCTURE OF TIFF FILE (MM): MemIo |
||
149 | address | tag | type | count | offset | value |
||
150 | 794 | 0x829a ExposureTime | RATIONAL | 1 | 1254 | 1254/0 |
||
151 | 806 | 0x829d FNumber | RATIONAL | 1 | 1262 | 1262/0 |
||
152 | 818 | 0x8822 ExposureProgram | SHORT | 1 | 65536 | 1 |
||
153 | 830 | 0x9000 ExifVersion | UNDEFINED | 4 | 808596016 | 0220 |
||
154 | 842 | 0x9003 DateTimeOriginal | ASCII | 20 | 1270 | 2004:06:21 23:37:53 |
||
155 | 854 | 0x9004 DateTimeDigitized | ASCII | 20 | 1290 | 2004:06:21 23:37:53 |
||
156 | 866 | 0x9101 ComponentsConfiguration | UNDEFINED | 4 | 16909056 | ... |
||
157 | 878 | 0x9102 CompressedBitsPerPixel | RATIONAL | 1 | 1310 | 1310/0 |
||
158 | 890 | 0x9201 ShutterSpeedValue | SRATIONAL | 1 | 1318 | 1318/0 |
||
159 | 902 | 0x9202 ApertureValue | RATIONAL | 1 | 1326 | 1326/0 |
||
160 | 914 | 0x9204 ExposureBiasValue | SRATIONAL | 1 | 1334 | 1334/0 |
||
161 | 926 | 0x9205 MaxApertureValue | RATIONAL | 1 | 1342 | 1342/0 |
||
162 | 938 | 0x9207 MeteringMode | SHORT | 1 | 131072 | 2 |
||
163 | 950 | 0x9208 LightSource | SHORT | 1 | 655360 | 10 |
||
164 | 962 | 0x9209 Flash | SHORT | 1 | 0 | 0 |
||
165 | 974 | 0x920a FocalLength | RATIONAL | 1 | 1350 | 1350/0 |
||
166 | 986 | 0x9290 SubSecTime | ASCII | 3 | 808845312 | 06 |
||
167 | 998 | 0x9291 SubSecTimeOriginal | ASCII | 3 | 808845312 | 06 |
||
168 | 1010 | 0x9292 SubSecTimeDigitized | ASCII | 3 | 808845312 | 06 |
||
169 | 1022 | 0xa000 FlashpixVersion | UNDEFINED | 4 | 808529968 | 0100 |
||
170 | 1034 | 0xa001 ColorSpace | SHORT | 1 |4294901760 | 65535 |
||
171 | 1046 | 0xa002 PixelXDimension | LONG | 1 | 200 | 200 |
||
172 | 1058 | 0xa003 PixelYDimension | LONG | 1 | 130 | 130 |
||
173 | 1070 | 0xa217 SensingMethod | SHORT | 1 | 131072 | 2 |
||
174 | 1082 | 0xa300 FileSource | UNDEFINED | 1 | 50331648 | . |
||
175 | 1094 | 0xa301 SceneType | UNDEFINED | 1 | 16777216 | . |
||
176 | 1106 | 0xa401 CustomRendered | SHORT | 1 | 0 | 0 |
||
177 | 1118 | 0xa402 ExposureMode | SHORT | 1 | 65536 | 1 |
||
178 | 1130 | 0xa403 WhiteBalance | SHORT | 1 | 65536 | 1 |
||
179 | 1142 | 0xa404 DigitalZoomRatio | RATIONAL | 1 | 1358 | 1358/0 |
||
180 | 1154 | 0xa405 FocalLengthIn35mmFilm | SHORT | 1 | 4128768 | 63 |
||
181 | 1166 | 0xa406 SceneCaptureType | SHORT | 1 | 0 | 0 |
||
182 | 1178 | 0xa407 GainControl | SHORT | 1 | 0 | 0 |
||
183 | 1190 | 0xa408 Contrast | SHORT | 1 | 0 | 0 |
||
184 | 1202 | 0xa409 Saturation | SHORT | 1 | 0 | 0 |
||
185 | 1214 | 0xa40a Sharpness | SHORT | 1 | 0 | 0 |
||
186 | 1226 | 0xa40c SubjectDistanceRange | SHORT | 1 | 0 | 0 |
||
187 | 1238 | 0xa420 ImageUniqueID | ASCII | 33 | 1366 | 127c1377b054a3f65bf2754ebb24e7f2 ... |
||
188 | END MemIo |
||
189 | 226 | 0x8825 GPSTag | LONG | 1 | 1400 | 1400 |
||
190 | 1422 | 0x0103 Compression | SHORT | 1 | 393216 | 6 |
||
191 | 1434 | 0x011a XResolution | RATIONAL | 1 | 1498 | 1498/0 |
||
192 | 1446 | 0x011b YResolution | RATIONAL | 1 | 1506 | 1506/0 |
||
193 | 1458 | 0x0128 ResolutionUnit | SHORT | 1 | 131072 | 2 |
||
194 | 1470 | 0x0201 JPEGInterchangeFormat | LONG | 1 | 1514 | 1514 |
||
195 | 1482 | 0x0202 JPEGInterchangeFormatLeng | LONG | 1 | 4196 | 4196 |
||
196 | END MemIo |
||
197 | 5722 | 0xffed APP13 | 3038 | Photoshop 3.0.8BIM..........Z... |
||
198 | Record | DataSet | Name | Length | Data |
||
199 | 1 | 90 | CharacterSet | 3 | .%G |
||
200 | 1 | 90 | CharacterSet | 3 | .%G |
||
201 | 2 | 0 | RecordVersion | 2 | .. |
||
202 | 2 | 120 | Caption | 402 | 040621-N-6536T-062.USS Ronald Reagan (CV... |
||
203 | 2 | 122 | Writer | 9 | Dir. NVNS |
||
204 | 2 | 40 | SpecialInstructions | 49 | Credit as U.S. Navy photo by Elizabeth T... |
||
205 | 2 | 80 | Byline | 32 | Photographer..s Mate 3rd Class ( |
||
206 | 2 | 85 | BylineTitle | 21 | U.S Navy Photographer |
||
207 | 2 | 110 | Credit | 8 | U.S Navy |
||
208 | 2 | 115 | Source | 24 | Navy Visual News Service |
||
209 | 2 | 5 | ObjectName | 18 | 040621-N-6536T-062 |
||
210 | 2 | 55 | DateCreated | 8 | 20040621 |
||
211 | 2 | 60 | TimeCreated | 11 | 000000+0000 |
||
212 | 2 | 62 | DigitizationDate | 8 | 20040621 |
||
213 | 2 | 63 | DigitizationTime | 11 | 233753-0400 |
||
214 | 2 | 90 | City | 19 | Straits of Magellan |
||
215 | 2 | 101 | CountryName | 13 | South America |
||
216 | 2 | 15 | Category | 1 | N |
||
217 | 2 | 20 | SuppCategory | 12 | 703-614-9154 |
||
218 | 2 | 20 | SuppCategory | 23 | navyvisualnews@navy.mil |
||
219 | 2 | 20 | SuppCategory | 11 | UNCLASSFIED |
||
220 | 2 | 10 | Urgency | 1 | 5 |
||
221 | 2 | 25 | Keywords | 13 | ronald reagan |
||
222 | 2 | 25 | Keywords | 6 | reagan |
||
223 | 2 | 25 | Keywords | 6 | cvn 76 |
||
224 | 2 | 25 | Keywords | 6 | cvn-76 |
||
225 | 2 | 25 | Keywords | 18 | straights magellan |
||
226 | 2 | 25 | Keywords | 8 | magellan |
||
227 | 2 | 25 | Keywords | 7 | carrier |
||
228 | 2 | 25 | Keywords | 12 | nimitz-class |
||
229 | 2 | 25 | Keywords | 4 | ship |
||
230 | 2 | 25 | Keywords | 8 | underway |
||
231 | 8762 | 0xffe1 APP1 | 5329 | http://ns.adobe.com/xap/1.0/.<?x |
||
232 | 14093 | 0xffe2 APP2 | 576 | ICC_PROFILE......0ADBE....mntrRG chunk 1/1 |
||
233 | 14671 | 0xffee APP14 | 14 | Adobe.d@...... |
||
234 | 14687 | 0xffdb DQT | 132 |
||
235 | 14821 | 0xffc0 SOF0 | 17 |
||
236 | 14840 | 0xffdd DRI | 4 |
||
237 | 14846 | 0xffc4 DHT | 418 |
||
238 | 15266 | 0xffda SOS |
||
239 | 544 rmills@rmillsmbp:~/gnu/exiv2/trunk $ </pre> |