1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="utf-8"/> 5 <title>TIFF Metadata Format Specification and Usage Notes</title> 6 </head> 7 <!-- 8 Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved. 9 DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 10 11 This code is free software; you can redistribute it and/or modify it 12 under the terms of the GNU General Public License version 2 only, as 13 published by the Free Software Foundation. Oracle designates this 14 particular file as subject to the "Classpath" exception as provided 15 by Oracle in the LICENSE file that accompanied this code. 16 17 This code is distributed in the hope that it will be useful, but WITHOUT 18 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 19 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 20 version 2 for more details (a copy is included in the LICENSE file that 21 accompanied this code). 22 23 You should have received a copy of the GNU General Public License version 24 2 along with this work; if not, write to the Free Software Foundation, 25 Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 26 27 Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 28 or visit www.oracle.com if you need additional information or have any 29 questions. 30 --> 31 32 <body> 33 <main role="main"> 34 <h1>TIFF Metadata Format Specification and Usage Notes</h1> 35 36 <a href="#Reading">Reading Images</a> 37 <ul> 38 <li><a href="#ColorConversionRead">Color Conversion</a></li> 39 <li><a href="#ColorSpacesRead">Color Spaces</a></li> 40 <li><a href="#ICCProfilesRead">ICC Profiles</a></li> 41 <li><a href="#MetadataIssuesRead">Metadata Issues</a> 42 <ul> 43 <li><a href="#MapNativeStandard">Native to Standard Metadata Mapping</a></li> 44 </ul> 45 </li> 46 <li><a href="#ExifRead">Reading Exif Images</a> 47 <ul> 48 <li><a href="#ExifReadTIFF">Reading Uncompressed Exif Images</a></li> 49 <li><a href="#ExifReadJPEG">Reading Compressed Exif Images</a></li> 50 </ul> 51 </li> 52 </ul> 53 <a href="#Writing">Writing Images</a><br/> 54 <ul> 55 <li><a href="#Compression">Compression</a></li> 56 <li><a href="#ColorConversionWrite">Color Conversion</a></li> 57 <li><a href="#ICCProfilesWrite">ICC Profiles</a></li> 58 <li><a href="#MetadataIssuesWrite">Metadata Issues</a> 59 <ul> 60 <li><a href="#MapStandardNative">Standard to Native Metadata Mapping</a></li> 61 </ul> 62 <li><a href="#ExifWrite">Writing Exif Images</a> 63 <ul> 64 <li><a href="#ExifWriteTIFF">Writing Uncompressed Exif Images</a></li> 65 <li><a href="#ExifWriteJPEG">Writing Compressed Exif Images</a></li> 66 </ul> 67 </li> 68 </ul> 69 <a href="#StreamMetadata">Native Stream Metadata Format</a><br/> 70 <a href="#ImageMetadata">Native Image Metadata Format</a> 71 72 <h2><a id="Reading">Reading Images</a></h2> 73 74 TIFF images are read by an <a href="../../ImageReader.html">ImageReader</a> 75 which may be controlled by its public interface as well as via a supplied 76 <a href="../../plugins/tiff/TIFFImageReadParam.html">TIFFImageReadParam</a>. 77 78 <!-- <h3>Supported Image Types</h3> --> 79 80 <!-- Table? --> 81 82 <h3><a id="ColorConversionRead">Color Conversion</a></h3> 83 84 <p>If the source image data 85 have photometric type CIE L*a*b* or YCbCr, and the destination color space 86 type is RGB, then the source image data will be automatically converted to 87 RGB using an internal color converter.</p> 88 89 <h3><a id="ColorSpacesRead">Color Spaces</a></h3> 90 91 The raw color space assigned by default, i.e., in the absence of a 92 user-supplied <a href="../../ImageTypeSpecifier.html">ImageTypeSpecifier</a>, 93 will be the first among the following which applies: 94 95 <ul> 96 <li>A color space created from the <a href="#ICCProfilesRead">ICC Profile</a> 97 metadata field if it is present and compatible with the image data 98 layout.</li> 99 <li><a id="nonICCProfile"></a>sRGB if the image is monochrome/bilevel 100 (a two-level color map is created internally).</li> 101 <li>sRGB if the image is palette-color.</li> 102 <li>Linear RGB if the image has three samples per pixel, has photometric type 103 CIE L*a*b*, or has photometric type YCbCr and is <i>not</i> 104 JPEG-compressed.</li> 105 <li>A <a href="#DefaultCMYK">default CMYK color space</a> if the image has 106 photometric type CMYK and four samples per pixel.</li> 107 <li>Grayscale if the image has one or two samples per pixel and uniformly 108 1, 2, 4, 8, 16, or 32 bits per sample or is floating point.</li> 109 <li>sRGB if the image has three or four samples per pixel and uniformly 110 1, 2, 4, 8, 16, or 32 bits per sample or is floating point.</li> 111 <li>A fabricated, <a href="#GenericCS">generic color space</a> if the image 112 has more than four samples per pixel and the number of bits per sample for 113 all bands is the same and is a multiple of 8.</li> 114 <li>Grayscale if the image has one or two samples per pixel regardless of 115 the number of bits per sample.</li> 116 <li>sRGB if the image has three or four samples per pixel regardless of 117 the number of bits per sample.</li> 118 <li>A fabricated, <a href="#GenericCS">generic color space</a> if the image 119 has more than four samples per pixel regardless of the number of bits per 120 sample.</li> 121 </ul> 122 123 <p><a id="DefaultCMYK"></a>The normalized color coordinate transformations 124 used for the default CMYK color space are defined as follows: 125 126 <ul> 127 <li>CMYK to linear RGB 128 <pre> 129 R = (1 - K)*(1 - C) 130 G = (1 - K)*(1 - M) 131 B = (1 - K)*(1 - Y) 132 </pre> 133 </li> 134 <li>Linear RGB to CMYK 135 <pre> 136 K = min{1 - R, 1 - G, 1 - B} 137 if(K != 1) { 138 C = (1 - R - K)/(1 - K) 139 M = (1 - G - K)/(1 - K) 140 Y = (1 - B - K)/(1 - K) 141 } else { 142 C = M = Y = 0 143 } 144 </pre> 145 </li> 146 </ul> 147 148 <p><a id="GenericCS"></a>The generic color space used when no other color space 149 can be inferred is provided merely to enable the data to be loaded. It is not 150 intended to provide accurate conversions of any kind.</p> 151 152 <p>If the data are known to be in a color space not correctly handled by the 153 foregoing, then an <code>ImageTypeSpecifier</code> should be 154 supplied to the reader and should be derived from a color space which is correct 155 for the data in question.</p> 156 157 <h3><a id="ICCProfilesRead">ICC Profiles</a></h3> 158 159 If an ICC profile is contained in the image metadata 160 (<a href="../../plugins/tiff/BaselineTIFFTagSet.html"> 161 BaselineTIFFTagSet</a>.TAG_ICC_PROFILE, tag number 34675), 162 an attempt will be made to use it to create the color space 163 of the loaded image. It will be used if the data layout is of component type 164 and the number of samples per pixel equals or is one greater than the number 165 of components described by the ICC profile. If the ICC profile is not used 166 then the color space will be inferred in one of the subsequent steps described 167 <a href="#nonICCProfile">above</a>. 168 169 <p>If for some reason the embedded ICC profile is not used automatically, then 170 it may be used manually by following this procedure: 171 172 <ol> 173 <li>Obtain the image metadata from 174 <code>ImageReader.getImageMetadata</code></li> 175 <li>Extract the ICC profile field and its value.</li> 176 <li>Create an <a href="../../../../java/awt/color/ICC_ColorSpace.html"> 177 ICC_ColorSpace</a> from an 178 <a href="../../../../java/awt/color/ICC_Profile.html"> 179 ICC_Profile</a> created from the ICC profile field data 180 using <code>ICC_Profile.getInstance(byte[])</code>.</li> 181 <li>Create an <code>ImageTypeSpecifier</code> from the new color 182 space using one of its factory methods which accepts an 183 <code>ICC_ColorSpace</code>. 184 <li>Create a compatible <a href="../../ImageReadParam.html">ImageReadParam</a> 185 and set the <code>ImageTypeSpecifier</code> using 186 <code>ImageReadParam.setDestinationType</code>.</li> 187 <li>Pass the parameter object to the appropriate <code>read</code> method.</li> 188 </ol> 189 190 <p>If the inferred color space not based on the ICC Profile field is compatible 191 with the ICC profile-based color space, then a second 192 <code>ImageTypeSpecifier</code> derived from this inferred color 193 space will be included in the 194 <a href="../../../../../java.base/java/util/Iterator.html">Iterator</a> returned by 195 <code>ImageReader.getImageTypes</code>. If the iterator contains 196 more than one type, the first one will be based on the ICC profile and the 197 second on the inferred color space.</p> 198 199 <h3><a id="MetadataIssuesRead">Metadata Issues</a></h3> 200 201 By default all recognized fields in the TIFF image file directory (IFD) are 202 loaded into the native image metadata object. Which fields are loaded may be 203 controlled by setting which TIFF tags the reader is allowed to recognize, 204 whether to read fields with unrecognized tags, and whether to ignore all 205 metadata. The reader is informed to disregard all metadata as usual via the 206 <code>ignoreMetadata</code> parameter of 207 <code>ImageReader.setInput(Object,boolean,boolean)</code>. It is 208 informed of which <a href="../../plugins/tiff/TIFFTag.html">TIFFTag</a>s to 209 recognize or not to recognize via 210 <code>TIFFImageReadParam.addAllowedTagSet(TIFFTagSet)</code> and 211 <code>TIFFImageReadParam.removeAllowedTagSet(TIFFTagSet)</code>. 212 If <code>ignoreMetadata</code> is <code>true</code>, then only metadata 213 essential to reading the image will be loaded into the native image metadata 214 object. If <code>ignoreMetadata</code> is <code>false</code>, then the reader 215 will by default load into the native image metadata object only those fields 216 which are either essential to reading the image or have a <code>TIFFTag</code> 217 contained in the one of the allowed <code>TIFFTagSet</code>s. Reading of 218 fields with tags not in the allowed <code>TIFFTagSet</code>s may be forced 219 by passing in a <code>TIFFImageReadParam</code> on which 220 <code>TIFFImageReadParam.setReadUnknownTags(boolean)</code> has been 221 invoked with parameter <code>true</code>. 222 223 <p>Use of a <a href="../../plugins/tiff/TIFFDirectory.html">TIFFDirectory</a> 224 object may simplify gaining access to metadata values. An instance of 225 <code>TIFFDirectory</code> may be created from the <code>IIOMetadata</code> 226 object returned by the TIFF reader using the 227 <code>TIFFDirectory.createFromMetadata</code> method.</p> 228 229 <h4><a id="MapNativeStandard"></a> 230 Mapping of TIFF Native Image Metadata to the Standard Metadata Format</h4> 231 232 The derivation of standard metadata format 233 <a href="standard_metadata.html">javax_imageio_1.0</a> 234 elements from <a href="#ImageMetadata">TIFF native image metadata</a> is given 235 in the following table. 236 237 <table border="1"> 238 <tr> 239 <th>Standard Metadata Element</th> 240 <th>Derivation from TIFF Fields</th> 241 </tr> 242 <tr> 243 <td>/Chroma/ColorSpaceType@name</td> 244 <td>PhotometricInterpretation: WhiteIsZero, BlackIsZero, TransparencyMask = 245 "GRAY"; RGB, PaletteColor => "RGB"; CMYK => "CMYK"; 246 YCbCr => "YCbCr"; 247 CIELab, ICCLab => "Lab".</td> 248 </tr> 249 <tr> 250 <td>/Chroma/NumChannels@value</td> 251 <td>SamplesPerPixel</td> 252 </tr> 253 <tr> 254 <td>/Chroma/BlackIsZero@value</td> 255 <td>"TRUE" <=> PhotometricInterpretation => WhiteIsZero</td> 256 </tr> 257 <tr> 258 <td>/Chroma/Palette</td> 259 <td>ColorMap</td> 260 </tr> 261 <tr> 262 <td>/Compression/CompressionTypeName@value</td> 263 <td>Compression: Uncompressed => "none"; CCITT 1D => "CCITT 264 RLE"; 265 Group 3 Fax => "CCITT T.4"; Group 4 Fax => "CCITT T.6"; 266 LZW => "LZW"; 267 JPEG => "Old JPEG"; New JPEG => "JPEG"; Zlib =>> "ZLib"; PackBits => 268 "PackBits"; 269 Deflate => "Deflate"; Exif JPEG => "JPEG".</td> 270 </tr> 271 <tr> 272 <td>/Compression/Lossless@value</td> 273 <td>Compression: JPEG or New JPEG => "FALSE"; otherwise "TRUE".</td> 274 </tr> 275 <tr> 276 <td>/Data/PlanarConfiguration@value</td> 277 <td>Chunky => "PixelInterleaved"; Planar => "PlaneInterleaved".</td> 278 </tr> 279 <tr> 280 <td>/Data/SampleFormat@value</td> 281 <td>PhotometricInterpretation PaletteColor => "Index"; 282 SampleFormat unsigned integer data => "UnsignedIntegral"; 283 SampleFormat two's complement signed integer data => "SignedIntegral"; 284 SampleFormat IEEE floating point data => "Real"; 285 otherwise element not emitted. 286 </td> 287 </tr> 288 <tr> 289 <td>/Data/BitsPerSample@value</td> 290 <td>BitsPerSample as a space-separated list.</td> 291 </tr> 292 <tr> 293 <td>/Data/SampleMSB@value</td> 294 <td>FillOrder: left-to-right => space-separated list of BitsPerSample-1; 295 right-to-left => space-separated list of 0s.</td> 296 </tr> 297 <tr> 298 <td>/Dimension/PixelAspectRatio@value</td> 299 <td>(1/XResolution)/(1/YResolution)</td> 300 </tr> 301 <tr> 302 <td>/Dimension/ImageOrientation@value</td> 303 <td>Orientation</td> 304 </tr> 305 <tr> 306 <td>/Dimension/HorizontalPixelSize@value</td> 307 <td>1/XResolution in millimeters if ResolutionUnit is not None.</td> 308 </tr> 309 <tr> 310 <td>/Dimension/VerticalPixelSize@value</td> 311 <td>1/YResolution in millimeters if ResolutionUnit is not None.</td> 312 </tr> 313 <tr> 314 <td>/Dimension/HorizontalPosition@value</td> 315 <td>XPosition in millimeters if ResolutionUnit is not None.</td> 316 </tr> 317 <tr> 318 <td>/Dimension/VerticalPosition@value</td> 319 <td>YPosition in millimeters if ResolutionUnit is not None.</td> 320 </tr> 321 <tr> 322 <td>/Document/FormatVersion@value</td> 323 <td>6.0</td> 324 </tr> 325 <tr> 326 <td>/Document/SubimageInterpretation@value</td> 327 <td>NewSubFileType: transparency => "TransparencyMask"; 328 reduced-resolution => "ReducedResolution"; 329 single page => "SinglePage".</td> 330 </tr> 331 <tr> 332 <td>/Document/ImageCreationTime@value</td> 333 <td>DateTime</td> 334 </tr> 335 <tr> 336 <td>/Text/TextEntry</td> 337 <td>DocumentName, ImageDescription, Make, Model, PageName, Software, 338 Artist, HostComputer, InkNames, Copyright: 339 /Text/TextEntry@keyword = field name, 340 /Text/TextEntry@value = field value.<br> 341 Example: TIFF Software field => /Text/TextEntry@keyword = "Software", 342 /Text/TextEntry@value = Name and version number of the software package(s) 343 used to create the image.</td> 344 </tr> 345 <tr> 346 <td>/Transparency/Alpha@value</td> 347 <td>ExtraSamples: associated alpha => "premultiplied"; 348 unassociated alpha => "nonpremultiplied".</td> 349 </tr> 350 </table> 351 352 <h3><a id="ExifRead">Reading Exif Images</a></h3> 353 354 The TIFF reader may be used to read an uncompressed Exif image or the 355 contents of the <code>APP1</code> marker segment of a compressed Exif image. 356 357 <h4><a id="ExifReadTIFF">Reading Uncompressed Exif Images</a></h4> 358 359 An uncompressed Exif image is a one- or two-page uncompressed TIFF image 360 with a specific ordering of its IFD and image data content. Each pixel 361 has three 8-bit samples with photometric interpretation RGB or YCbCr. 362 The image stream must contain a single primary image and may contain a 363 single thumbnail which if present must also be uncompressed. The usual 364 <code>ImageReader</code> methods may be used to read the image 365 data and metadata: 366 367 <pre><code> 368 ImageInputStream input; 369 ImageReader tiffReader; 370 ImageReadParam tiffReadParam; 371 372 tiffReader.setInput(input); 373 374 // Read primary image and IFD. 375 BufferedImage image = tiffReader.read(0, tiffReadParam); 376 IIOMetadata primaryIFD = tiffReader.getImageMetadata(0); 377 378 // Read thumbnail if present. 379 BufferedImage thumbnail = null; 380 if (tiffReader.getNumImages(true) > 1) { 381 thumbnail = tiffReader.read(1, tiffReadParam); 382 } 383 </code></pre> 384 385 Note that the Exif thumbnail is treated as a separate page in the TIFF 386 stream and not as a thumbnail, i.e., 387 <code>tiffReader.hasThumbnails(0)</code> will return <code>false</code>. 388 389 <h4><a id="ExifReadJPEG">Reading Compressed Exif Images</a></h4> 390 391 A compressed Exif image is a 3-band ISO/IEC 10918-1 baseline DCT JPEG stream 392 with an inserted <code>APP1</code> marker segment. The parameters of the marker 393 segment after the length are the 6-byte sequence 394 <code>{'E', 'x', 'i', 'f', 0x00, 0x00}</code> 395 followed by a complete TIFF stream. The embedded TIFF stream contains a primary 396 IFD describing the JPEG image optionally followed by a thumbnail IFD and 397 compressed or uncompressed thumbnail image data. Note that the embedded TIFF 398 stream does not contain any image data associated with the primary IFD 399 nor any descriptive fields which duplicate information found in the JPEG 400 stream itself. 401 402 <p>The parameter content of the <code>APP1</code> marker segment may be obtained 403 from the user object of the associated <code>Node</code> in a 404 <code>javax_imageio_jpeg_image_1.0</code> native image metadata tree extracted 405 from the image metadata object returned by the JPEG reader. This APP1 Exif 406 node will be a child of the node named "markerSequence" and will 407 have name <code>unknown</code> and an attribute named <code>MarkerTag</code> with 408 integral value <code>0xE1</code> (<code>String</code> value 409 <code>"225"</code>). The user object of this node will be a byte array 410 which starts with the six bytes <code>{'E', 'x', 'i', 'f', '0', '0'}</code>. 411 The primary IFD and the thumbnail IFD and image may be 412 read from the user object by the usual <code>ImageReader</code> 413 methods: 414 415 <pre><code> 416 ImageReader jpegReader; 417 ImageReader tiffReader; 418 419 // Obtain the APP1 Exif marker data from the JPEG image metadata. 420 IIOMetadata jpegImageMetadata = jpegReader.getImageMetadata(0); 421 String nativeFormat = jpegImageMetadata.getNativeMetadataFormatName(); 422 Node jpegImageMetadataTree = jpegImageMetadata.getAsTree(nativeFormat); 423 424 // getExifMarkerData() returns the byte array which is the user object 425 // of the APP1 Exif marker node. 426 byte[] app1Params = getExifMarkerData(jpegImageMetadataTree); 427 if (app1Params == null) { 428 throw new IIOException("APP1 Exif marker not found."); 429 } 430 431 // Set up input, skipping Exif ID 6-byte sequence. 432 MemoryCacheImageInputStream app1ExifInput 433 = new MemoryCacheImageInputStream 434 (new ByteArrayInputStream(app1Params, 6, app1Params.length - 6)); 435 tiffReader.setInput(app1ExifInput); 436 437 // Read primary IFD. 438 IIOMetadata primaryIFD = tiffReader.getImageMetadata(0); 439 440 // Read thumbnail if present. 441 BufferedImage thumbnail = null; 442 if (tiffReader.getNumImages(true) > 1) { 443 thumbnail = tiffReader.read(1, tiffReadParam); 444 } 445 446 // Read the primary image. 447 BufferedImage image = jpegReader.read(0); 448 </code></pre> 449 450 Note that <code>tiffReader.getNumImages(true)</code> returns the number of 451 IFDs in the embedded TIFF stream including those corresponding to empty 452 images. Calling <code>tiffReader.read(0, readParam)</code> will throw 453 an exception as the primary image in the embedded TIFF stream is always 454 empty; the primary image should be obtained using the JPEG reader itself. 455 456 <h2><a id="Writing">Writing Images</a></h2> 457 458 TIFF images are written by a <a href="../../ImageWriter.html">ImageWriter</a> which may be 459 controlled by its public interface as well as via a supplied 460 <a href="../../ImageWriteParam.html">ImageWriteParam</a>. For an <code>ImageWriteParam</code> returned 461 by the <code>getDefaultWriteParam()</code> method of the TIFF <code>ImageWriter</code>, 462 the <code>canWriteTiles()</code> and <code>canWriteCompressed()</code> methods 463 will return <code>true</code>; the <code>canOffsetTiles()</code> and 464 <code>canWriteProgressive()</code> methods will return <code>false</code>. 465 466 The TIFF writer supports many optional capabilities including writing tiled 467 images, inserting images, writing or inserting empty images, and replacing image 468 data. Pixels may be replaced in either empty or non-empty images but if and 469 only if the data are not compressed. 470 471 <p> If tiles are being written, then each of their dimensions will be 472 rounded to the nearest multiple of 16 per the TIFF specification. If 473 JPEG-in-TIFF compression is being used, and tiles are being written 474 each tile dimension will be rounded to the nearest multiple of 8 times 475 the JPEG minimum coded unit (MCU) in that dimension. If JPEG-in-TIFF 476 compression is being used and strips are being written, the number of 477 rows per strip is rounded to a multiple of 8 times the maximum MCU over 478 both dimensions.</p> 479 480 <!-- <h3>Supported Image Types</h3> --> 481 482 <!-- Table? --> 483 484 <h3><a id="Compression">Compression</a></h3> 485 486 The compression type may be set via the <code>setCompressionType()</code> method of 487 the <code>ImageWriteParam</code> after setting the compression mode to 488 <code>MODE_EXPLICIT</code>. The set of innately 489 supported compression types is listed in the following table: 490 491 <table border=1> 492 <caption><b>Supported Compression Types</b></caption> 493 <tr><th>Compression Type</th> <th>Description</th> <th>Reference</th></tr> 494 <tr> 495 <td>CCITT RLE</td> 496 <td>Modified Huffman compression</td> 497 <td>TIFF 6.0 Specification, Section 10</td> 498 </tr> 499 <tr> 500 <td>CCITT T.4</td> 501 <td>CCITT T.4 bilevel encoding/Group 3 facsimile compression</td> 502 <td>TIFF 6.0 Specification, Section 11</td> 503 </tr> 504 <tr> 505 <td>CCITT T.6</td> 506 <td>CCITT T.6 bilevel encoding/Group 4 facsimile compression</td> 507 <td>TIFF 6.0 Specification, Section 11</td></tr> 508 <tr> 509 <td>LZW</td> 510 <td>LZW compression</td> 511 <td>TIFF 6.0 Specification, Section 13</td></tr> 512 <tr> 513 <td>JPEG</td> 514 <td>"New" JPEG-in-TIFF compression</td> 515 <td>TIFF Technical Note #2</td></tr> 516 <tr> 517 <td>ZLib</td> 518 <td>"Deflate/Inflate" compression (see note following this table)</td> 519 <td>Adobe Photoshop® TIFF Technical Notes</td> 520 </tr> 521 <tr> 522 <td>PackBits</td> 523 <td>Byte-oriented, run length compression</td> 524 <td>TIFF 6.0 Specification, Section 9</td> 525 </tr> 526 <tr> 527 <td>Deflate</td> 528 <td>"Zip-in-TIFF" compression (see note following this table)</td> 529 <td><a href="https://tools.ietf.org/html/rfc1950"> 530 ZLIB Compressed Data Format Specification</a>, 531 <a href="https://tools.ietf.org/html/rfc1951"> 532 DEFLATE Compressed Data Format Specification</a></td> 533 </tr> 534 <tr> 535 <td>Exif JPEG</td> 536 <td>Exif-specific JPEG compression (see note following this table)</td> 537 <td><a href="http://www.exif.org/Exif2-2.PDF">Exif 2.2 Specification</a> 538 (PDF), section 4.5.5, "Basic Structure of Thumbnail Data"</td> 539 </table> 540 541 <p> 542 Old-style JPEG compression as described in section 22 of the TIFF 6.0 543 Specification is <i>not</i> supported. 544 </p> 545 546 <p> The CCITT compression types are applicable to bilevel (1-bit) 547 images only. The JPEG compression type is applicable to byte 548 grayscale (1-band) and RGB (3-band) images only.</p> 549 550 <p> 551 ZLib and Deflate compression are identical except for the value of the 552 TIFF Compression field: for ZLib the Compression field has value 8 553 whereas for Deflate it has value 32946 (0x80b2). In both cases each 554 image segment (strip or tile) is written as a single complete zlib data 555 stream. 556 </p> 557 558 <p> 559 "Exif JPEG" is a compression type used when writing the contents of an 560 APP1 Exif marker segment for inclusion in a JPEG native image metadata 561 tree. The contents appended to the output when this compression type is 562 used are a function of whether an empty or non-empty image is written. 563 If the image is empty, then a TIFF IFD adhering to the specification of 564 a compressed Exif primary IFD is appended. If the image is non-empty, 565 then a complete IFD and image adhering to the specification of a 566 compressed Exif thumbnail IFD and image are appended. Note that the 567 data of the empty image may <i>not</i> later be appended using the pixel 568 replacement capability of the TIFF writer. 569 </p> 570 571 <p> If ZLib/Deflate or JPEG compression is used, the compression quality 572 may be set. For ZLib/Deflate the supplied floating point quality value is 573 rescaled to the range <code>[1, 9]</code> and truncated to an integer 574 to derive the Deflate compression level. For JPEG the floating point 575 quality value is passed directly to the JPEG writer plug-in which 576 interprets it in the usual way.</p> 577 578 <h3><a id="ColorConversionWrite">Color Conversion</a></h3> 579 580 <p>If the source image data 581 color space type is RGB, and the destination photometric type is CIE L*a*b* or 582 YCbCr, then the source image data will be automatically converted from 583 RGB using an internal color converter.</p> 584 585 <h3><a id="ICCProfilesWrite">ICC Profiles</a></h3> 586 587 An <code>ICC Profile</code> field will be written if either: 588 <ul> 589 <li>one is present in the native image metadata 590 <a href="../IIOMetadata.html">IIOMetadata</a> instance supplied to the writer, 591 or</li> 592 <li>the <a href="../../../../java/awt/color/ColorSpace.html">ColorSpace</a> 593 of the destination <code>ImageTypeSpecifier</code> is an instance of 594 <code>ICC_ColorSpace</code> which is not one of the standard 595 color spaces defined by the <code>CS_*</code> constants in the 596 <code>ColorSpace</code> class. The destination type is set via 597 <code>ImageWriteParam.setDestinationType(ImageTypeSpecifier)</code> and defaults 598 to the <code>ImageTypeSpecifier</code> of the image being written. 599 </li> 600 </ul> 601 602 <h3><a id="MetadataIssuesWrite">Metadata Issues</a></h3> 603 604 Some behavior of the writer is affected by or may affect the contents of 605 the image metadata which may be supplied by the user. 606 607 <p>For bilevel images, the <code>FillOrder</code>, and <code>T4Options</code> 608 fields affect the output data. The data will be filled right-to-left if 609 <code>FillOrder</code> is present with a value of 2 610 (<code>BaselineTIFFTagSet.FILL_ORDER_RIGHT_TO_LEFT</code>) 611 and will be filled left-to-right otherwise. The value of <code>T4Options</code> 612 specifies whether the data should be 1D- or 2D-encoded and whether EOL 613 padding should be used.</p> 614 615 <p>For all images the value of the <code>RowsPerStrip</code> field is used 616 to the set the number of rows per strip if the image is not tiled. The 617 default number of rows per strip is either 8 or the number of rows which 618 would fill no more than 8 kilobytes, whichever is larger.</p> 619 620 <p>For all images the tile dimensions may be set using the <code>TileWidth</code> 621 and <code>TileLength</code> field values if the tiling mode is 622 <code>ImageWriteParam.MODE_COPY_FROM_METADATA</code>. If this mode 623 is set but the fields are not, their respective default values are the image 624 width and height.</p> 625 626 <p>When using JPEG-in-TIFF compression, a <code>JPEGTables</code> field will be 627 written to the IFD and abbreviated JPEG streams to each strip or tile if and 628 only if a <code>JPEGTables</code> field is contained in the metadata object 629 provided to the writer. If the contents of the <code>JPEGTables</code> field is 630 a valid tables-only JPEG stream, then it will be used; otherwise the contents 631 of the field will be replaced with default visually lossless tables. If no 632 such <code>JPEGTables</code> field is present in the metadata, then no 633 <code>JPEGTables</code> field will be written to the output and each strip or 634 tile will be written as a separate, self-contained JPEG stream.</p> 635 636 <p>When using Deflate/ZLib or LZW compression, if the image has 8 bits per 637 sample, a horizontal differencing predictor will be used if the 638 <code>Predictor</code> field is present with a value of 2 639 (<code>BaselineTIFFTagSet.PREDICTOR_HORIZONTAL_DIFFERENCING</code>). 640 If prediction is so requested but the image does not have 641 8 bits per sample the field will be reset to have the value 1 642 (<code>BaselineTIFFTagSet.PREDICTOR_NONE</code>). 643 </p> 644 645 <p>Some fields may be added or modified: 646 647 <ul> 648 <li><code>PhotometricInterpretation</code> if not present.</li> 649 <li><code>PlanarConfiguration</code> if this field is present with value 650 <code>Planar</code> is is reset to <code>Chunky</code>.</li> 651 <li><code>Compression</code> always.</li> 652 <li><code>BitsPerSample</code> if the image is not bilevel.</li> 653 <li><code>SamplesPerPixel</code> always.</li> 654 <li><code>ExtraSamples</code> if an alpha channel is present.</li> 655 <li><code>SampleFormat</code> if not present and the data are 16- or 32-bit 656 integers or floating point.</li> 657 <li><code>ColorMap</code> if the <code>PhotometricInterpretation</code> is 658 <code>RGBPalette</code>.</li> 659 <li><code>ImageWidth</code> and <code>ImageLength</code> always.</li> 660 <li><code>TileWidth</code>, <code>TileLength</code>, <code>TileOffsets</code>, and 661 <code>TileByteCounts</code> if a tiled image is being written.</li> 662 <li><code>RowsPerStrip</code>, <code>StripOffsets</code>, and <code>StripByteCounts</code> 663 if a tiled image is <i>not</i> being written.</li> 664 <li><code>XResolution</code>, <code>YResolution</code>, and <code>ResolutionUnit</code> 665 if none of these is present.</li> 666 <li><code>YCbCrSubsampling</code> and <code>YCbCrPositioning</code> if the 667 photometric interpretation is YCbCr and the compression type is not JPEG 668 (only [1, 1] subsampling and cosited positioning are supported for 669 non-JPEG YCbCr output).</li> 670 <li><code>YCbCrSubsampling</code>, <code>YCbCrPositioning</code>, and 671 <code>ReferenceBlackWhite</code>: if the compression type is JPEG and the color 672 space is RGB these will be reset to [2, 2] centered subsampling with no 673 headroom/footroom (0:255,128:255,128:255).</li> 674 </ul> 675 676 <p>Some fields may be removed: 677 678 <ul> 679 <li><code>BitsPerSample</code> if the image is bilevel.</li> 680 <li><code>ExtraSamples</code> if the image does not have an alpha channel.</li> 681 <li><code>ColorMap</code> if the photometric interpretation is not 682 <code>RGBPalette</code>.</li> 683 <li><code>TileWidth</code>, <code>TileLength</code>, <code>TileOffsets</code>, and 684 <code>TileByteCounts</code> if tiling <i>is not</i> being used.</li> 685 <li><code>RowsPerStrip</code>, <code>StripOffsets</code>, and <code>StripByteCounts</code> 686 if tiling <i>is</i> being used.</li> 687 <li><code>YCbCrSubsampling</code>, <code>YCbCrPositioning</code>, and 688 <code>ReferenceBlackWhite</code> if the compression type is JPEG and the 689 color space is grayscale.</li> 690 <li><code>JPEGProc</code>, <code>JPEGInterchangeFormat</code>, 691 <code>JPEGInterchangeFormatLength</code>, <code>JPEGRestartInterval</code>, 692 <code>JPEGLosslessPredictors</code>, <code>JPEGPointTransforms</code>, 693 <code>JPEGQTables</code>, <code>JPEGDCTables</code>, and 694 <code>JPEGACTables</code> if the compression type is JPEG.</li> 695 </ul> 696 697 <p>Other fields present in the supplied metadata are uninterpreted and will 698 be written as supplied.</p> 699 700 <p>If an Exif image is being written, the set of fields present and their 701 values will be modified such that the result is in accord with the Exif 2.2 702 specification.</p> 703 704 <p>Setting up the image metadata to write to a TIFF stream may be simplified 705 by using the <code>TIFFDirectory</code> class 706 which represents a TIFF IFD. A field in a TIFF IFD is represented by an 707 instance of <a href="../../plugins/tiff/TIFFField.html">TIFFField</a>. For each 708 field to be written a <code>TIFFField</code> may be added to the 709 <code>TIFFDirectory</code> and the latter converted to an 710 <code>IIOMetadata</code> object by invoking 711 <code>TIFFDirectory.getAsMetadata</code>. The 712 <code>IIOMetadata</code> object so obtained may then be passed to the TIFF 713 writer.</p> 714 715 <h4><a id="MapStandardNative"></a> 716 Mapping of the Standard Metadata Format to TIFF Native Image Metadata</h4> 717 718 The derivation of <a href="#ImageMetadata">TIFF native image metadata</a> 719 elements from the standard metadata format 720 <a href="standard_metadata.html">javax_imageio_1.0</a> is 721 given in the following table. 722 723 <table border="1"> 724 <tr> 725 <th>TIFF Field</th> 726 <th>Derivation from Standard Metadata Elements</th> 727 </tr> 728 <tr> 729 <td> 730 PhotometricInterpretation 731 </td> 732 <td>/Chroma/ColorSpaceType@name: "GRAY" and /Chroma/BlackIsZero@value = "FALSE" 733 => WhiteIsZero; "GRAY" and /Document/SubimageInterpretation@value = 734 "TransparencyMask" => TransparencyMask; "RGB" and /Chroma/Palette present => 735 PaletteColor; "GRAY" => BlackIsZero; "RGB" => RGB; "YCbCr" => YCbCr; 736 "CMYK" => CMYK; "Lab" => CIELab.</td> 737 </tr> 738 <tr> 739 <td>SamplesPerPixel</td> 740 <td>/Chroma/NumChannels@value</td> 741 </tr> 742 <tr> 743 <td>ColorMap</td> 744 <td>/Chroma/Palette</td> 745 </tr> 746 <tr> 747 <td>Compression</td> 748 <td>/Compression/CompressionTypeName@value: "none" => Uncompressed; 749 "CCITT RLE" => CCITT 1D; "CCITT T.4" => Group 3 Fax; "CCITT T.6" => Group 4 750 Fax; "LZW" => LZW; "Old JPEG" => JPEG; "JPEG" => New JPEG; "ZLib" => ZLib; 751 "PackBits" => PackBits; "Deflate" => Deflate.</td> 752 </tr> 753 <tr> 754 <td>PlanarConfiguration</td> 755 <td>/Data/PlanarConfiguration@value: "PixelInterleaved" => Chunky; 756 "PlaneInterleaved" => Planar.</td> 757 </tr> 758 <tr> 759 <td>SampleFormat</td> 760 <td>/Data/SampleFormat@value: "SignedIntegral" => two's complement signed 761 integer data; "UnsignedIntegral" => unsigned integer data; "Real" => 762 IEEE floating point data; "Index" => unsigned integer data. 763 </td> 764 </tr> 765 <tr> 766 <td>BitsPerSample</td> 767 <td>/Data/BitsPerSample@value: space-separated list parsed to char array.</td> 768 </tr> 769 <tr> 770 <td>FillOrder</td> 771 <td>/Data/SampleMSB@value: if all values in space-separated list are 0s => 772 right-to-left; otherwise => left-to-right. 773 </td> 774 </tr> 775 <tr> 776 <td>XResolution</td> 777 <td>(10 / /Dimension/HorizontalPixelSize@value) or 778 (10 / (/Dimension/VerticalPixelSize@value * 779 /Dimension/PixelAspectRatio@value))</td> 780 </tr> 781 <tr> 782 <td>YResolution</td> 783 <td>(10 / /Dimension/VerticalPixelSize@value) or 784 (10 / (/Dimension/HorizontalPixelSize@value / 785 /Dimension/PixelAspectRatio@value))</td> 786 </tr> 787 <tr> 788 <td>ResolutionUnit</td> 789 <td>Centimeter if XResolution or YResolution set; otherwise None.</td> 790 </tr> 791 <tr> 792 <td>Orientation</td> 793 <td>/Dimension/ImageOrientation@value</td> 794 </tr> 795 <tr> 796 <td>XPosition</td> 797 <td>/Dimension/HorizontalPosition@value / 10</td> 798 </tr> 799 <tr> 800 <td>YPosition</td> 801 <td>/Dimension/VerticalPosition@value / 10</td> 802 </tr> 803 <tr> 804 <td>NewSubFileType</td> 805 <td>/Document/SubimageInterpretation@value: "TransparencyMask" => 806 transparency mask; "ReducedResolution" => reduced-resolution; 807 "SinglePage" => single page.</td> 808 </tr> 809 <tr> 810 <td>DateTime</td> 811 <td>/Document/ImageCreationTime@value</td> 812 </tr> 813 <tr> 814 <td>DocumentName, ImageDescription, Make, Model, PageName, Software, 815 Artist, HostComputer, InkNames, Copyright</td> 816 <td>/Text/TextEntry: if /Text/TextEntry@keyword is the name of any of the 817 TIFF Fields, e.g., "Software", then the field is added with content 818 /Text/TextEntry@value and count 1.</td> 819 </tr> 820 <tr> 821 <td>ExtraSamples</td> 822 <td>/Transparency/Alpha@value: "premultiplied" => associated alpha, count 1; 823 "nonpremultiplied" => unassociated alpha, count 1.</td> 824 </tr> 825 <tr> 826 <td></td> 827 <td></td> 828 </tr> 829 </table> 830 831 <h3><a id="ExifWrite">Writing Exif Images</a></h3> 832 833 The TIFF writer may be used to write an uncompressed Exif image or the 834 contents of the <code>APP1</code> marker segment of a compressed Exif image. 835 836 <h4><a id="ExifWriteTIFF">Writing Uncompressed Exif Images</a></h4> 837 838 When writing a sequence of images each image is normally recorded as 839 {IFD, IFD Value, Image Data}. The Exif specification requires 840 that an uncompressed Exif image be structured as follows: 841 842 <a id="ExifStructure"></a> 843 <ol> 844 <li>Image File Header</li> 845 <li>Primary IFD</li> 846 <li>Primary IFD Value</li> 847 <li>Thumbnail IFD</li> 848 <li>Thumbnail IFD Value</li> 849 <li>Thumbnail Image Data</li> 850 <li>Primary Image Data</li> 851 </ol> 852 853 To meet the requirement of the primary image data being recorded last, the 854 primary image must be written initially as an empty image and have its data 855 added via pixel replacement after the thumbnail IFD and image data have been 856 written: 857 858 <pre><code> 859 ImageWriter tiffWriter; 860 ImageWriteParam tiffWriteParam; 861 IIOMetadata tiffStreamMetadata; 862 IIOMetadata primaryIFD; 863 BufferedImage image; 864 BufferedImage thumbnail; 865 866 // Specify uncompressed output. 867 tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_DISABLED); 868 869 if (thumbnail != null) { 870 // Write the TIFF header. 871 tiffWriter.prepareWriteSequence(tiffStreamMetadata); 872 873 // Append the primary IFD. 874 tiffWriter.prepareInsertEmpty(-1, // append 875 new ImageTypeSpecifier(image), 876 image.getWidth(), 877 image.getHeight(), 878 primaryIFD, 879 null, // thumbnails 880 tiffWriteParam); 881 tiffWriter.endInsertEmpty(); 882 883 // Append the thumbnail image data. 884 tiffWriter.writeToSequence(new IIOImage(thumbnail, null, null), 885 tiffWriteParam); 886 887 // Insert the primary image data. 888 tiffWriter.prepareReplacePixels(0, new Rectangle(image.getWidth(), 889 image.getHeight())); 890 tiffWriter.replacePixels(image, tiffWriteParam); 891 tiffWriter.endReplacePixels(); 892 893 // End writing. 894 tiffWriter.endWriteSequence(); 895 } else { 896 // Write only the primary IFD and image data. 897 tiffWriter.write(tiffStreamMetadata, 898 new IIOImage(image, null, primaryIFD), 899 tiffWriteParam); 900 } 901 </code></pre> 902 903 <h4><a id="ExifWriteJPEG">Writing Compressed Exif Images</a></h4> 904 905 The structure of the embedded TIFF stream in the <code>APP1</code> segment of a 906 compressed Exif image is identical to the <a href="#ExifStructure"> 907 uncompressed Exif image structure</a> except that there are no primary 908 image data, i.e., the primary IFD does not refer to any image data. 909 910 <pre><code> 911 ImageWriter tiffWriter; 912 ImageWriteParam tiffWriteParam; 913 IIOMetadata tiffStreamMetadata; 914 BufferedImage image; 915 BufferedImage thumbnail; 916 IIOMetadata primaryIFD; 917 ImageOutputStream output; 918 919 // Set up an output to contain the APP1 Exif TIFF stream. 920 ByteArrayOutputStream baos = new ByteArrayOutputStream(); 921 MemoryCacheImageOutputStream app1ExifOutput = 922 new MemoryCacheImageOutputStream(baos); 923 tiffWriter.setOutput(app1ExifOutput); 924 925 // Set compression for the thumbnail. 926 tiffWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 927 tiffWriteParam.setCompressionType("Exif JPEG"); 928 929 // Write the APP1 Exif TIFF stream. 930 if (thumbnail != null) { 931 // Write the TIFF header. 932 tiffWriter.prepareWriteSequence(tiffStreamMetadata); 933 934 // Append the primary IFD. 935 tiffWriter.prepareInsertEmpty(-1, // append 936 new ImageTypeSpecifier(image), 937 image.getWidth(), 938 image.getHeight(), 939 primaryIFD, 940 null, // thumbnails 941 tiffWriteParam); 942 tiffWriter.endInsertEmpty(); 943 944 // Append the thumbnail IFD and image data. 945 tiffWriter.writeToSequence(new IIOImage(thumbnail, null, 946 null), tiffWriteParam); 947 948 // End writing. 949 tiffWriter.endWriteSequence(); 950 } else { 951 // Write only the primary IFD. 952 tiffWriter.prepareWriteEmpty(tiffStreamMetadata, 953 new ImageTypeSpecifier(image), 954 image.getWidth(), 955 image.getHeight(), 956 primaryIFD, 957 null, // thumbnails 958 tiffWriteParam); 959 tiffWriter.endWriteEmpty(); 960 } 961 962 // Flush data into byte stream. 963 app1ExifOutput.flush(); 964 965 // Create APP1 parameter array. 966 byte[] app1Parameters = new byte[6 + baos.size()]; 967 968 // Add APP1 Exif ID bytes. 969 app1Parameters[0] = (byte) 'E'; 970 app1Parameters[1] = (byte) 'x'; 971 app1Parameters[2] = (byte) 'i'; 972 app1Parameters[3] = (byte) 'f'; 973 app1Parameters[4] = app1Parameters[5] = (byte) 0; 974 975 // Append TIFF stream to APP1 parameters. 976 System.arraycopy(baos.toByteArray(), 0, app1Parameters, 6, baos.size()); 977 978 // Create the APP1 Exif node to be added to native JPEG image metadata. 979 IIOMetadataNode app1Node = new IIOMetadataNode("unknown"); 980 app1Node.setAttribute("MarkerTag", String.valueOf(0xE1)); 981 app1Node.setUserObject(app1Parameters); 982 983 // Append the APP1 Exif marker to the "markerSequence" node. 984 IIOMetadata jpegImageMetadata = 985 jpegWriter.getDefaultImageMetadata(new ImageTypeSpecifier(image), 986 jpegWriteParam); 987 String nativeFormat = jpegImageMetadata.getNativeMetadataFormatName(); 988 Node tree = jpegImageMetadata.getAsTree(nativeFormat); 989 NodeList children = tree.getChildNodes(); 990 int numChildren = children.getLength(); 991 for (int i = 0; i < numChildren; i++) { 992 Node child = children.item(i); 993 if (child.getNodeName().equals("markerSequence")) { 994 child.appendChild(app1Node); 995 break; 996 } 997 } 998 jpegImageMetadata.setFromTree(nativeFormat, tree); 999 1000 // Write the JPEG image data including the APP1 Exif marker. 1001 jpegWriter.setOutput(output); 1002 jpegWriter.write(new IIOImage(image, null, jpegImageMetadata)); 1003 </code></pre> 1004 1005 The <code>"unknown"</code> node created above would be appended to the 1006 <code>"markerSequence"</code> node of the native JPEG image metadata 1007 and written to the JPEG stream when the primary image is written using 1008 the JPEG writer. 1009 1010 <h2><a id="StreamMetadata">Stream Metadata</a></h2> 1011 1012 The DTD for the TIFF native stream metadata format is as follows: 1013 1014 <pre> 1015 <!DOCTYPE "javax_imageio_tiff_stream_1.0" [ 1016 1017 <!ELEMENT "javax_imageio_tiff_stream_1.0" (ByteOrder)> 1018 1019 <!ELEMENT "ByteOrder" EMPTY> 1020 <!-- The stream byte order --> 1021 <!ATTLIST "ByteOrder" "value" #CDATA #REQUIRED> 1022 <!-- One of "BIG_ENDIAN" or "LITTLE_ENDIAN" --> 1023 <!-- Data type: String --> 1024 ]> 1025 </pre> 1026 1027 <h2><a id="ImageMetadata">Image Metadata</a></h2> 1028 1029 The DTD for the TIFF native image metadata format is as follows: 1030 1031 <pre> 1032 <!DOCTYPE "javax_imageio_tiff_image_1.0" [ 1033 1034 <!ELEMENT "javax_imageio_tiff_image_1.0" (TIFFIFD)*> 1035 1036 <!ELEMENT "TIFFIFD" (TIFFField | TIFFIFD)*> 1037 <!-- An IFD (directory) containing fields --> 1038 <!ATTLIST "TIFFIFD" "tagSets" #CDATA #REQUIRED> 1039 <!-- Data type: String --> 1040 <!ATTLIST "TIFFIFD" "parentTagNumber" #CDATA #IMPLIED> 1041 <!-- The tag number of the field pointing to this IFD --> 1042 <!-- Data type: Integer --> 1043 <!ATTLIST "TIFFIFD" "parentTagName" #CDATA #IMPLIED> 1044 <!-- A mnemonic name for the field pointing to this IFD, if known 1045 --> 1046 <!-- Data type: String --> 1047 1048 <!ELEMENT "TIFFField" (TIFFBytes | TIFFAsciis | 1049 TIFFShorts | TIFFSShorts | TIFFLongs | TIFFSLongs | 1050 TIFFRationals | TIFFSRationals | 1051 TIFFFloats | TIFFDoubles | TIFFUndefined)> 1052 <!-- A field containing data --> 1053 <!ATTLIST "TIFFField" "number" #CDATA #REQUIRED> 1054 <!-- The tag number asociated with the field --> 1055 <!-- Data type: String --> 1056 <!ATTLIST "TIFFField" "name" #CDATA #IMPLIED> 1057 <!-- A mnemonic name associated with the field, if known --> 1058 <!-- Data type: String --> 1059 1060 <!ELEMENT "TIFFBytes" (TIFFByte)*> 1061 <!-- A sequence of TIFFByte nodes --> 1062 1063 <!ELEMENT "TIFFByte" EMPTY> 1064 <!-- An integral value between 0 and 255 --> 1065 <!ATTLIST "TIFFByte" "value" #CDATA #IMPLIED> 1066 <!-- The value --> 1067 <!-- Data type: String --> 1068 <!ATTLIST "TIFFByte" "description" #CDATA #IMPLIED> 1069 <!-- A description, if available --> 1070 <!-- Data type: String --> 1071 1072 <!ELEMENT "TIFFAsciis" (TIFFAscii)*> 1073 <!-- A sequence of TIFFAscii nodes --> 1074 1075 <!ELEMENT "TIFFAscii" EMPTY> 1076 <!-- A String value --> 1077 <!ATTLIST "TIFFAscii" "value" #CDATA #IMPLIED> 1078 <!-- The value --> 1079 <!-- Data type: String --> 1080 1081 <!ELEMENT "TIFFShorts" (TIFFShort)*> 1082 <!-- A sequence of TIFFShort nodes --> 1083 1084 <!ELEMENT "TIFFShort" EMPTY> 1085 <!-- An integral value between 0 and 65535 --> 1086 <!ATTLIST "TIFFShort" "value" #CDATA #IMPLIED> 1087 <!-- The value --> 1088 <!-- Data type: String --> 1089 <!ATTLIST "TIFFShort" "description" #CDATA #IMPLIED> 1090 <!-- A description, if available --> 1091 <!-- Data type: String --> 1092 1093 <!ELEMENT "TIFFSShorts" (TIFFSShort)*> 1094 <!-- A sequence of TIFFSShort nodes --> 1095 1096 <!ELEMENT "TIFFSShort" EMPTY> 1097 <!-- An integral value between -32768 and 32767 --> 1098 <!ATTLIST "TIFFSShort" "value" #CDATA #IMPLIED> 1099 <!-- The value --> 1100 <!-- Data type: String --> 1101 <!ATTLIST "TIFFSShort" "description" #CDATA #IMPLIED> 1102 <!-- A description, if available --> 1103 <!-- Data type: String --> 1104 1105 <!ELEMENT "TIFFLongs" (TIFFLong)*> 1106 <!-- A sequence of TIFFLong nodes --> 1107 1108 <!ELEMENT "TIFFLong" EMPTY> 1109 <!-- An integral value between 0 and 4294967295 --> 1110 <!ATTLIST "TIFFLong" "value" #CDATA #IMPLIED> 1111 <!-- The value --> 1112 <!-- Data type: String --> 1113 <!ATTLIST "TIFFLong" "description" #CDATA #IMPLIED> 1114 <!-- A description, if available --> 1115 <!-- Data type: String --> 1116 1117 <!ELEMENT "TIFFSLongs" (TIFFSLong)*> 1118 <!-- A sequence of TIFFSLong nodes --> 1119 1120 <!ELEMENT "TIFFSLong" EMPTY> 1121 <!-- An integral value between -2147483648 and 2147482647 --> 1122 <!ATTLIST "TIFFSLong" "value" #CDATA #IMPLIED> 1123 <!-- The value --> 1124 <!-- Data type: String --> 1125 <!ATTLIST "TIFFSLong" "description" #CDATA #IMPLIED> 1126 <!-- A description, if available --> 1127 <!-- Data type: String --> 1128 1129 <!ELEMENT "TIFFRationals" (TIFFRational)*> 1130 <!-- A sequence of TIFFRational nodes --> 1131 1132 <!ELEMENT "TIFFRational" EMPTY> 1133 <!-- A rational value consisting of an unsigned numerator and 1134 denominator --> 1135 <!ATTLIST "TIFFRational" "value" #CDATA #IMPLIED> 1136 <!-- The numerator and denominator, separated by a slash --> 1137 <!-- Data type: String --> 1138 1139 <!ELEMENT "TIFFSRationals" (TIFFSRational)*> 1140 <!-- A sequence of TIFFSRational nodes --> 1141 1142 <!ELEMENT "TIFFSRational" EMPTY> 1143 <!-- A rational value consisting of a signed numerator and 1144 denominator --> 1145 <!ATTLIST "TIFFSRational" "value" #CDATA #IMPLIED> 1146 <!-- The numerator and denominator, separated by a slash --> 1147 <!-- Data type: String --> 1148 1149 <!ELEMENT "TIFFFloats" (TIFFFloat)*> 1150 <!-- A sequence of TIFFFloat nodes --> 1151 1152 <!ELEMENT "TIFFFloat" EMPTY> 1153 <!-- A single-precision floating-point value --> 1154 <!ATTLIST "TIFFFloat" "value" #CDATA #IMPLIED> 1155 <!-- The value --> 1156 <!-- Data type: String --> 1157 1158 <!ELEMENT "TIFFDoubles" (TIFFDouble)*> 1159 <!-- A sequence of TIFFDouble nodes --> 1160 1161 <!ELEMENT "TIFFDouble" EMPTY> 1162 <!-- A double-precision floating-point value --> 1163 <!ATTLIST "TIFFDouble" "value" #CDATA #IMPLIED> 1164 <!-- The value --> 1165 <!-- Data type: String --> 1166 1167 <!ELEMENT "TIFFUndefined" EMPTY> 1168 <!-- Uninterpreted byte data --> 1169 <!ATTLIST "TIFFUndefined" "value" #CDATA #IMPLIED> 1170 <!-- A list of comma-separated byte values --> 1171 <!-- Data type: String --> 1172 ]> 1173 </pre> 1174 1175 @since 9 1176 </main> 1177 </body> 1178 </html>