Class TIFFImageReader


  • public final class TIFFImageReader
    extends ImageReaderBase
    ImageReader implementation for Aldus/Adobe Tagged Image File Format (TIFF).

    The reader is supposed to be fully "Baseline TIFF" compliant, and supports the following image types:

    • Class B (Bi-level), all relevant compression types, 1 bit per sample
    • Class G (Gray), all relevant compression types, 2, 4, 8, 16 or 32 bits per sample, unsigned integer
    • Class P (Palette/indexed color), all relevant compression types, 1, 2, 4, 8 or 16 bits per sample, unsigned integer
    • Class R (RGB), all relevant compression types, 8 or 16 bits per sample, unsigned integer
    In addition, it supports many common TIFF extensions such as:
    • Tiling
    • Class F (Facsimile), CCITT T.4 and T.6 compression (types 3 and 4), 1 bit per sample
    • LZW Compression (type 5)
    • "Old-style" JPEG Compression (type 6), as a best effort, as the spec is not well-defined
    • JPEG Compression (type 7)
    • ZLib (aka Adobe-style Deflate) Compression (type 8)
    • Deflate Compression (type 32946)
    • Horizontal differencing Predictor (type 2) for LZW, ZLib, Deflate and PackBits compression
    • Alpha channel (ExtraSamples types 1/Associated Alpha and 2/Unassociated Alpha)
    • Class S, CMYK data (PhotometricInterpretation type 5/Separated)
    • Class Y, YCbCr data (PhotometricInterpretation type 6/YCbCr for both JPEG and other compressions
    • Planar data (PlanarConfiguration type 2/Planar)
    • ICC profiles (ICCProfile)
    • BitsPerSample values up to 16 for most PhotometricInterpretations
    • Multiple images (pages) in one file
    Version:
    $Id: TIFFImageReader.java,v 1.0 08.05.12 15:14 haraldk Exp$
    See Also:
    Adobe TIFF developer resources, TIFF 6.0 specification, Wikipedia TIFF, AWare Systems TIFF pages
    • Constructor Summary

      Constructors 
      Constructor Description
      TIFFImageReader​(javax.imageio.spi.ImageReaderSpi provider)  
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      boolean canReadRaster()  
      private void clamp​(float[] rowDataFloat)  
      private short clampShort​(int val)  
      private java.awt.image.Raster clipRowToRect​(java.awt.image.Raster raster, java.awt.Rectangle rect, int[] bands, int xSub)  
      private java.awt.image.WritableRaster clipToRect​(java.awt.image.WritableRaster raster, java.awt.Rectangle rect, int[] bands)  
      private java.awt.Rectangle computeTileRegion​(int imageIndex, int tileX, int tileY)  
      private boolean containsZero​(long[] byteCounts)  
      private void convertYCbCr2RGB​(short[] yCbCr, short[] rgb, double[] coefficients, double[] referenceBW, int offset)  
      private java.io.InputStream createDecompressorStream​(int compression, int width, int bands, java.io.InputStream stream)  
      private java.io.InputStream createFillOrderStream​(int fillOrder, java.io.InputStream stream)  
      private javax.imageio.ImageTypeSpecifier createImageTypeSpecifier​(int planarConfiguration, java.awt.color.ColorSpace cs, int dataType, int significantSamples, int samplesPerPixel, boolean alpha, boolean alphaPremultiplied)  
      private java.awt.image.IndexColorModel createIndexColorModel​(int bitsPerSample, int dataType, int[] cmapShort)  
      private static java.io.InputStream createJFIFStream​(int bands, int stripTileWidth, int stripTileHeight, byte[][] qTables, byte[][] dcTables, byte[][] acTables, int subsampling)  
      private javax.imageio.ImageReader createJPEGDelegate()  
      private static int[] createOffsets​(int samplesPerPixel)  
      private java.io.InputStream createUnpredictorStream​(int predictor, int width, int samplesPerPixel, int bitsPerSample, java.io.InputStream stream, java.nio.ByteOrder byteOrder)  
      private java.io.InputStream createYCbCrUpsamplerStream​(int photometricInterpretation, int planarConfiguration, int plane, int transferType, int[] yCbCrSubsampling, int yCbCrPos, int colsInTile, java.io.InputStream stream, java.nio.ByteOrder byteOrder)  
      private int findCCITTType​(int encodedCompression, java.io.InputStream stream)  
      private int getBitsPerSample()  
      private long getCCITTOptions​(int compression)  
      private int getDataType​(int sampleFormat, int bitsPerSample)  
      int getHeight​(int imageIndex)  
      private java.awt.color.ICC_Profile getICCProfile()  
      javax.imageio.metadata.IIOMetadata getImageMetadata​(int imageIndex)
      Default implementation that always returns null.
      java.util.Iterator<javax.imageio.ImageTypeSpecifier> getImageTypes​(int imageIndex)  
      private int getJPEGSourceCS​(javax.imageio.metadata.IIOMetadata imageMetadata)  
      private javax.imageio.metadata.IIOMetadataNode getNode​(javax.imageio.metadata.IIOMetadataNode parent, java.lang.String tagName)  
      int getNumImages​(boolean allowSearch)
      Default implementation that always returns 1.
      private int getOpaqueSamplesPerPixel​(int photometricInterpretation)  
      private int getPhotometricInterpretationWithFallback()  
      javax.imageio.ImageTypeSpecifier getRawImageType​(int imageIndex)  
      private int getSampleFormat()  
      javax.imageio.metadata.IIOMetadata getStreamMetadata()
      Default implementation that always returns null.
      int getTileHeight​(int imageIndex)  
      int getTileWidth​(int imageIndex)  
      private double[] getValueAsDoubleArray​(int tag, java.lang.String tagName, boolean required, int expectedLength)  
      private int getValueAsInt​(int tag, java.lang.String tagName)  
      private int getValueAsIntWithDefault​(int tag, java.lang.Integer defaultValue)  
      private int getValueAsIntWithDefault​(int tag, java.lang.String tagName, java.lang.Integer defaultValue)  
      private long[] getValueAsLongArray​(int tag, java.lang.String tagName, boolean required)  
      private long getValueAsLongWithDefault​(int tag, java.lang.Long defaultValue)  
      private long getValueAsLongWithDefault​(int tag, java.lang.String tagName, java.lang.Long defaultValue)  
      private java.lang.Number getValueAsNumberWithDefault​(int tag, java.lang.String tagName, java.lang.Number defaultValue)  
      int getWidth​(int imageIndex)  
      (package private) static int guessPhotometricInterpretation​(int compression, int samplesPerPixel, Entry extraSamples, Entry colorMap)  
      (package private) static java.lang.String intToStr​(int value)  
      boolean isImageTiled​(int imageIndex)  
      static void main​(java.lang.String[] args)  
      private boolean needsCSConversion​(int compression, int photometricInterpretation, javax.imageio.metadata.IIOMetadata imageMetadata)  
      private void normalizeColor​(int photometricInterpretation, int numBands, byte[] data)  
      private void normalizeColor​(int photometricInterpretation, int numBands, float[] data)  
      private void normalizeColor​(int photometricInterpretation, int numBands, int[] data)  
      private void normalizeColor​(int photometricInterpretation, int numBands, short[] data)  
      private void normalizeColorPlanar​(int photometricInterpretation, java.awt.image.WritableRaster raster)  
      java.awt.image.BufferedImage read​(int imageIndex, javax.imageio.ImageReadParam param)  
      private void readIFD​(int imageIndex)  
      private javax.imageio.metadata.IIOMetadata readJPEGMetadataSafe​(javax.imageio.ImageReader jpegReader)  
      private void readMetadata()  
      (package private) static java.lang.String readPascalString​(java.io.DataInput pInput)  
      java.awt.image.Raster readRaster​(int imageIndex, javax.imageio.ImageReadParam param)  
      private void readStripTileData​(java.awt.image.Raster tileRowRaster, java.awt.Rectangle srcRegion, int xSub, int ySub, int band, int numBands, int interpretation, java.awt.image.WritableRaster raster, int startCol, int startRow, int colsInTile, int rowsInTile, javax.imageio.stream.ImageInputStream input)  
      java.awt.image.BufferedImage readTile​(int imageIndex, int tileX, int tileY)  
      java.awt.image.Raster readTileRaster​(int imageIndex, int tileX, int tileY)  
      private static void replaceBytesWithUndefined​(javax.imageio.metadata.IIOMetadataNode tree)  
      protected void resetMembers()
      Resets all member variables.
      protected static void showIt​(java.awt.image.BufferedImage image, java.lang.String title)  
      private void toFloat​(short[] rowDataShort, float[] rowDataFloat)  
      • Methods inherited from class javax.imageio.ImageReader

        abort, abortRequested, addIIOReadProgressListener, addIIOReadUpdateListener, addIIOReadWarningListener, checkReadParamBandSettings, clearAbortRequest, computeRegions, getAspectRatio, getAvailableLocales, getDefaultReadParam, getFormatName, getImageMetadata, getInput, getLocale, getMinIndex, getNumThumbnails, getOriginatingProvider, getSourceRegion, getStreamMetadata, getThumbnailHeight, getThumbnailWidth, getTileGridXOffset, getTileGridYOffset, hasThumbnails, isIgnoringMetadata, isRandomAccessEasy, isSeekForwardOnly, processImageComplete, processImageProgress, processImageStarted, processImageUpdate, processPassComplete, processPassStarted, processReadAborted, processSequenceComplete, processSequenceStarted, processThumbnailComplete, processThumbnailPassComplete, processThumbnailPassStarted, processThumbnailProgress, processThumbnailStarted, processThumbnailUpdate, processWarningOccurred, processWarningOccurred, read, readAll, readAll, readAsRenderedImage, readerSupportsThumbnails, readThumbnail, removeAllIIOReadProgressListeners, removeAllIIOReadUpdateListeners, removeAllIIOReadWarningListeners, removeIIOReadProgressListener, removeIIOReadUpdateListener, removeIIOReadWarningListener, setInput, setInput, setLocale
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • DEBUG

        static final boolean DEBUG
      • CCIR_601_1_COEFFICIENTS

        static final double[] CCIR_601_1_COEFFICIENTS
      • REFERENCE_BLACK_WHITE_YCC_DEFAULT

        static final double[] REFERENCE_BLACK_WHITE_YCC_DEFAULT
      • overrideCCITTCompression

        private int overrideCCITTCompression
      • BYTE_TO_UNDEFINED_NODES

        private static final java.util.Set<java.lang.String> BYTE_TO_UNDEFINED_NODES
    • Constructor Detail

      • TIFFImageReader

        TIFFImageReader​(javax.imageio.spi.ImageReaderSpi provider)
    • Method Detail

      • readMetadata

        private void readMetadata()
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • readPascalString

        static java.lang.String readPascalString​(java.io.DataInput pInput)
                                          throws java.io.IOException
        Throws:
        java.io.IOException
      • intToStr

        static java.lang.String intToStr​(int value)
      • readIFD

        private void readIFD​(int imageIndex)
                      throws java.io.IOException
        Throws:
        java.io.IOException
      • getNumImages

        public int getNumImages​(boolean allowSearch)
                         throws java.io.IOException
        Description copied from class: ImageReaderBase
        Default implementation that always returns 1.
        Overrides:
        getNumImages in class ImageReaderBase
        Parameters:
        allowSearch - ignored, unless overridden
        Returns:
        1, unless overridden
        Throws:
        java.io.IOException - never, unless overridden
      • getValueAsNumberWithDefault

        private java.lang.Number getValueAsNumberWithDefault​(int tag,
                                                             java.lang.String tagName,
                                                             java.lang.Number defaultValue)
                                                      throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getValueAsLongWithDefault

        private long getValueAsLongWithDefault​(int tag,
                                               java.lang.String tagName,
                                               java.lang.Long defaultValue)
                                        throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getValueAsLongWithDefault

        private long getValueAsLongWithDefault​(int tag,
                                               java.lang.Long defaultValue)
                                        throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getValueAsIntWithDefault

        private int getValueAsIntWithDefault​(int tag,
                                             java.lang.String tagName,
                                             java.lang.Integer defaultValue)
                                      throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getValueAsIntWithDefault

        private int getValueAsIntWithDefault​(int tag,
                                             java.lang.Integer defaultValue)
                                      throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getValueAsInt

        private int getValueAsInt​(int tag,
                                  java.lang.String tagName)
                           throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getWidth

        public int getWidth​(int imageIndex)
                     throws java.io.IOException
        Specified by:
        getWidth in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • getHeight

        public int getHeight​(int imageIndex)
                      throws java.io.IOException
        Specified by:
        getHeight in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • getRawImageType

        public javax.imageio.ImageTypeSpecifier getRawImageType​(int imageIndex)
                                                         throws java.io.IOException
        Overrides:
        getRawImageType in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • createImageTypeSpecifier

        private javax.imageio.ImageTypeSpecifier createImageTypeSpecifier​(int planarConfiguration,
                                                                          java.awt.color.ColorSpace cs,
                                                                          int dataType,
                                                                          int significantSamples,
                                                                          int samplesPerPixel,
                                                                          boolean alpha,
                                                                          boolean alphaPremultiplied)
                                                                   throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • createOffsets

        private static int[] createOffsets​(int samplesPerPixel)
      • getPhotometricInterpretationWithFallback

        private int getPhotometricInterpretationWithFallback()
                                                      throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • guessPhotometricInterpretation

        static int guessPhotometricInterpretation​(int compression,
                                                  int samplesPerPixel,
                                                  Entry extraSamples,
                                                  Entry colorMap)
      • getOpaqueSamplesPerPixel

        private int getOpaqueSamplesPerPixel​(int photometricInterpretation)
                                      throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getDataType

        private int getDataType​(int sampleFormat,
                                int bitsPerSample)
                         throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • createIndexColorModel

        private java.awt.image.IndexColorModel createIndexColorModel​(int bitsPerSample,
                                                                     int dataType,
                                                                     int[] cmapShort)
      • getSampleFormat

        private int getSampleFormat()
                             throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getBitsPerSample

        private int getBitsPerSample()
                              throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getImageTypes

        public java.util.Iterator<javax.imageio.ImageTypeSpecifier> getImageTypes​(int imageIndex)
                                                                           throws java.io.IOException
        Specified by:
        getImageTypes in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • read

        public java.awt.image.BufferedImage read​(int imageIndex,
                                                 javax.imageio.ImageReadParam param)
                                          throws java.io.IOException
        Specified by:
        read in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • createYCbCrUpsamplerStream

        private java.io.InputStream createYCbCrUpsamplerStream​(int photometricInterpretation,
                                                               int planarConfiguration,
                                                               int plane,
                                                               int transferType,
                                                               int[] yCbCrSubsampling,
                                                               int yCbCrPos,
                                                               int colsInTile,
                                                               java.io.InputStream stream,
                                                               java.nio.ByteOrder byteOrder)
      • containsZero

        private boolean containsZero​(long[] byteCounts)
      • readJPEGMetadataSafe

        private javax.imageio.metadata.IIOMetadata readJPEGMetadataSafe​(javax.imageio.ImageReader jpegReader)
                                                                 throws java.io.IOException
        Throws:
        java.io.IOException
      • needsCSConversion

        private boolean needsCSConversion​(int compression,
                                          int photometricInterpretation,
                                          javax.imageio.metadata.IIOMetadata imageMetadata)
      • getJPEGSourceCS

        private int getJPEGSourceCS​(javax.imageio.metadata.IIOMetadata imageMetadata)
      • getNode

        private javax.imageio.metadata.IIOMetadataNode getNode​(javax.imageio.metadata.IIOMetadataNode parent,
                                                               java.lang.String tagName)
      • createJPEGDelegate

        private javax.imageio.ImageReader createJPEGDelegate()
                                                      throws java.io.IOException
        Throws:
        java.io.IOException
      • createJFIFStream

        private static java.io.InputStream createJFIFStream​(int bands,
                                                            int stripTileWidth,
                                                            int stripTileHeight,
                                                            byte[][] qTables,
                                                            byte[][] dcTables,
                                                            byte[][] acTables,
                                                            int subsampling)
                                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • clipRowToRect

        private java.awt.image.Raster clipRowToRect​(java.awt.image.Raster raster,
                                                    java.awt.Rectangle rect,
                                                    int[] bands,
                                                    int xSub)
      • clipToRect

        private java.awt.image.WritableRaster clipToRect​(java.awt.image.WritableRaster raster,
                                                         java.awt.Rectangle rect,
                                                         int[] bands)
      • readStripTileData

        private void readStripTileData​(java.awt.image.Raster tileRowRaster,
                                       java.awt.Rectangle srcRegion,
                                       int xSub,
                                       int ySub,
                                       int band,
                                       int numBands,
                                       int interpretation,
                                       java.awt.image.WritableRaster raster,
                                       int startCol,
                                       int startRow,
                                       int colsInTile,
                                       int rowsInTile,
                                       javax.imageio.stream.ImageInputStream input)
                                throws java.io.IOException
        Throws:
        java.io.IOException
      • toFloat

        private void toFloat​(short[] rowDataShort,
                             float[] rowDataFloat)
      • clamp

        private void clamp​(float[] rowDataFloat)
      • normalizeColorPlanar

        private void normalizeColorPlanar​(int photometricInterpretation,
                                          java.awt.image.WritableRaster raster)
                                   throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • normalizeColor

        private void normalizeColor​(int photometricInterpretation,
                                    int numBands,
                                    byte[] data)
                             throws java.io.IOException
        Throws:
        java.io.IOException
      • normalizeColor

        private void normalizeColor​(int photometricInterpretation,
                                    int numBands,
                                    short[] data)
                             throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • normalizeColor

        private void normalizeColor​(int photometricInterpretation,
                                    int numBands,
                                    int[] data)
      • normalizeColor

        private void normalizeColor​(int photometricInterpretation,
                                    int numBands,
                                    float[] data)
      • convertYCbCr2RGB

        private void convertYCbCr2RGB​(short[] yCbCr,
                                      short[] rgb,
                                      double[] coefficients,
                                      double[] referenceBW,
                                      int offset)
      • clampShort

        private short clampShort​(int val)
      • createDecompressorStream

        private java.io.InputStream createDecompressorStream​(int compression,
                                                             int width,
                                                             int bands,
                                                             java.io.InputStream stream)
                                                      throws java.io.IOException
        Throws:
        java.io.IOException
      • findCCITTType

        private int findCCITTType​(int encodedCompression,
                                  java.io.InputStream stream)
                           throws java.io.IOException
        Throws:
        java.io.IOException
      • createFillOrderStream

        private java.io.InputStream createFillOrderStream​(int fillOrder,
                                                          java.io.InputStream stream)
      • getCCITTOptions

        private long getCCITTOptions​(int compression)
                              throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • createUnpredictorStream

        private java.io.InputStream createUnpredictorStream​(int predictor,
                                                            int width,
                                                            int samplesPerPixel,
                                                            int bitsPerSample,
                                                            java.io.InputStream stream,
                                                            java.nio.ByteOrder byteOrder)
                                                     throws java.io.IOException
        Throws:
        java.io.IOException
      • getValueAsLongArray

        private long[] getValueAsLongArray​(int tag,
                                           java.lang.String tagName,
                                           boolean required)
                                    throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getValueAsDoubleArray

        private double[] getValueAsDoubleArray​(int tag,
                                               java.lang.String tagName,
                                               boolean required,
                                               int expectedLength)
                                        throws javax.imageio.IIOException
        Throws:
        javax.imageio.IIOException
      • getICCProfile

        private java.awt.color.ICC_Profile getICCProfile()
      • canReadRaster

        public boolean canReadRaster()
        Overrides:
        canReadRaster in class javax.imageio.ImageReader
      • readRaster

        public java.awt.image.Raster readRaster​(int imageIndex,
                                                javax.imageio.ImageReadParam param)
                                         throws java.io.IOException
        Overrides:
        readRaster in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • isImageTiled

        public boolean isImageTiled​(int imageIndex)
                             throws java.io.IOException
        Overrides:
        isImageTiled in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • getTileWidth

        public int getTileWidth​(int imageIndex)
                         throws java.io.IOException
        Overrides:
        getTileWidth in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • getTileHeight

        public int getTileHeight​(int imageIndex)
                          throws java.io.IOException
        Overrides:
        getTileHeight in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • computeTileRegion

        private java.awt.Rectangle computeTileRegion​(int imageIndex,
                                                     int tileX,
                                                     int tileY)
                                              throws java.io.IOException
        Throws:
        java.io.IOException
      • readTile

        public java.awt.image.BufferedImage readTile​(int imageIndex,
                                                     int tileX,
                                                     int tileY)
                                              throws java.io.IOException
        Overrides:
        readTile in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • readTileRaster

        public java.awt.image.Raster readTileRaster​(int imageIndex,
                                                    int tileX,
                                                    int tileY)
                                             throws java.io.IOException
        Overrides:
        readTileRaster in class javax.imageio.ImageReader
        Throws:
        java.io.IOException
      • getImageMetadata

        public javax.imageio.metadata.IIOMetadata getImageMetadata​(int imageIndex)
                                                            throws java.io.IOException
        Description copied from class: ImageReaderBase
        Default implementation that always returns null.
        Overrides:
        getImageMetadata in class ImageReaderBase
        Parameters:
        imageIndex - ignored, unless overridden
        Returns:
        null, unless overridden
        Throws:
        java.io.IOException - never, unless overridden.
      • getStreamMetadata

        public javax.imageio.metadata.IIOMetadata getStreamMetadata()
                                                             throws java.io.IOException
        Description copied from class: ImageReaderBase
        Default implementation that always returns null.
        Overrides:
        getStreamMetadata in class ImageReaderBase
        Returns:
        null, unless overridden
        Throws:
        java.io.IOException - never, unless overridden.
      • main

        public static void main​(java.lang.String[] args)
                         throws java.io.IOException
        Throws:
        java.io.IOException
      • replaceBytesWithUndefined

        private static void replaceBytesWithUndefined​(javax.imageio.metadata.IIOMetadataNode tree)
      • showIt

        protected static void showIt​(java.awt.image.BufferedImage image,
                                     java.lang.String title)