Class TIFFDecompressor

  • Direct Known Subclasses:
    TIFFDeflateDecompressor, TIFFFaxDecompressor, TIFFJPEGDecompressor, TIFFLSBDecompressor, TIFFLZWDecompressor, TIFFNullDecompressor, TIFFPackBitsDecompressor, TIFFYCbCrDecompressor

    public abstract class TIFFDecompressor
    extends java.lang.Object
    A class defining a pluggable TIFF decompressor.

    The mapping between source and destination Y coordinates is given by the equations:

     dx = (sx - sourceXOffset)/subsampleX + dstXOffset;
     dy = (sy - sourceYOffset)/subsampleY + dstYOffset;
     
    Note that the mapping from source coordinates to destination coordinates is not one-to-one if subsampling is being used, since only certain source pixels are to be copied to the destination. However, * the inverse mapping is always one-to-one:
     sx = (dx - dstXOffset)*subsampleX + sourceXOffset;
     sy = (dy - dstYOffset)*subsampleY + sourceYOffset;
     

    Decompressors may be written with various levels of complexity. The most complex decompressors will override the decode method, and will perform all the work of decoding, subsampling, offsetting, clipping, and format conversion. This approach may be the most efficient, since it is possible to avoid the use of extra image buffers, and it may be possible to avoid decoding portions of the image that will not be copied into the destination.

    Less ambitious decompressors may override the decodeRaw method, which is responsible for decompressing the entire tile or strip into a byte array (or other appropriate datatype). The default implementation of decode will perform all necessary setup of buffers, call decodeRaw to perform the actual decoding, perform subsampling, and copy the results into the final destination image. Where possible, it will pass the real image buffer to decodeRaw in order to avoid making an extra copy.

    Slightly more ambitious decompressors may override decodeRaw, but avoid writing pixels that will be discarded in the subsampling phase.

    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected int activeSrcHeight
      The height of the source region that will actually be copied into the destination image, taking into account all susbampling, offsetting, and clipping.
      protected int activeSrcMinX
      The X coordinate of the upper-left source pixel that will actually be copied into the destination image, taking into account all subsampling, offsetting, and clipping.
      protected int activeSrcMinY
      The Y coordinate of the upper-left source pixel that will actually be copied into the destination image, taking into account all subsampling, offsetting, and clipping.
      protected int activeSrcWidth
      The width of the source region that will actually be copied into the destination image, taking into account all susbampling, offsetting, and clipping.
      (package private) boolean adjustBitDepths  
      (package private) int[][] bitDepthScale  
      protected int[] bitsPerSample
      The value of the BitsPerSample tag.
      private int[] bitsPerSampleCache  
      protected int byteCount
      The number of bytes of data from the source ImageInputStream to be decompressed.
      protected TIFFColorConverter colorConverter
      A TIFFColorConverter object describing the color space of the encoded pixel data, or null.
      protected char[] colorMap
      The value of the ColorMap tag.
      protected int compression
      The value of the Compression tag.
      private static boolean DEBUG  
      private int[] destBitsPerSampleCache  
      protected int[] destinationBands
      The sequence of destination bands to receive the source data.
      private int[] destinationBandsCache  
      protected int dstHeight
      The height of the region of the destination image to be written.
      protected int dstMinX
      The X coordinate of the upper left pixel to be written in the destination image.
      protected int dstMinY
      The Y coordinate of the upper left pixel to be written in the destination image.
      protected int dstWidth
      The width of the region of the destination image to be written.
      protected int dstXOffset
      The horizontal destination offset used, along with sourceXOffset and subsampleX, to map between horizontal source and destination pixel coordinates.
      protected int dstYOffset
      The vertical destination offset used, along with sourceYOffset and subsampleY, to map between horizontal source and destination pixel coordinates.
      protected int[] extraSamples
      The value of the ExtraSamples tag.
      protected java.awt.image.BufferedImage image
      The final destination image.
      (package private) boolean isBilevel  
      (package private) boolean isContiguous  
      private boolean isFirstBitDepthTable  
      (package private) boolean isImageSimple  
      protected javax.imageio.metadata.IIOMetadata metadata
      The IIOMetadata object containing metadata for the current image.
      protected long offset
      The offset in the source ImageInputStream of the start of the data to be decompressed.
      protected int photometricInterpretation
      The value of the PhotometricInterpretation tag.
      protected boolean planar
      true if the image is encoded using separate planes.
      private boolean planarCache  
      protected java.awt.image.BufferedImage rawImage
      A BufferedImage for the decodeRaw method to write into.
      protected javax.imageio.ImageReader reader
      The ImageReader calling this TIFFDecompressor.
      protected int[] sampleFormat
      The value of the SampleFormat tag.
      protected int samplesPerPixel
      The value of the SamplesPerPixel tag.
      protected int[] sourceBands
      The sequence of source bands that are to be copied into the destination.
      private int[] sourceBandsCache  
      protected int sourceXOffset
      The source X offset used, along with dstXOffset and subsampleX, to map between horizontal source and destination pixel coordinates.
      protected int sourceYOffset
      The source Y offset used, along with dstYOffset and subsampleY, to map between vertical source and destination pixel coordinates.
      protected int srcHeight
      The height of the source region being decoded from the source stream.
      protected int srcMinX
      The X coordinate of the upper-left pixel of the source region being decoded from the source stream.
      protected int srcMinY
      The Y coordinate of the upper-left pixel of the source region being decoded from the source stream.
      protected int srcWidth
      The width of the source region being decoded from the source stream.
      protected javax.imageio.stream.ImageInputStream stream
      The ImageInputStream containing the TIFF source data.
      protected int subsampleX
      The horizontal subsampling factor.
      protected int subsampleY
      The vertical subsampling factor.
    • Method Summary

      All Methods Static Methods Instance Methods Abstract Methods Concrete Methods 
      Modifier and Type Method Description
      private static boolean areIntArraysEqual​(int[] a, int[] b)  
      private static boolean areSampleSizesEqual​(java.awt.image.SampleModel sm)
      Returns whether all samples have the same number of bits.
      void beginDecoding()
      This routine is called prior to a sequence of calls to the decode method, in order to allow any necessary tables or other structures to be initialized based on metadata values.
      (package private) static java.awt.image.ColorModel createComponentCM​(java.awt.color.ColorSpace colorSpace, int numBands, int dataType, boolean hasAlpha, boolean isAlphaPremultiplied)
      Create a ComponentColorModel for use in creating an ImageTypeSpecifier.
      (package private) static java.awt.image.SampleModel createInterleavedSM​(int dataType, int numBands)
      Create a PixelInterleavedSampleModel for use in creating an ImageTypeSpecifier.
      private static int createMask​(int[] bitsPerSample, int band)  
      java.awt.image.BufferedImage createRawImage()
      Creates a BufferedImage whose underlying data array will be suitable for holding the raw decoded output of the decodeRaw method.
      void decode()
      Decodes the input bit stream (located in the ImageInputStream stream, at offset offset, and continuing for byteCount bytes) into the output BufferedImage image.
      abstract void decodeRaw​(byte[] b, int dstOffset, int bitsPerPixel, int scanlineStride)
      Decodes the source data into the provided byte array b, starting at the offset given by dstOffset.
      void decodeRaw​(float[] f, int dstOffset, int bitsPerPixel, int scanlineStride)
      Decodes the source data into the provided float array f, starting at the offset given by dstOffset.
      void decodeRaw​(int[] i, int dstOffset, int bitsPerPixel, int scanlineStride)
      Decodes the source data into the provided int array i, starting at the offset given by dstOffset.
      void decodeRaw​(short[] s, int dstOffset, int bitsPerPixel, int scanlineStride)
      Decodes the source data into the provided short array s, starting at the offset given by dstOffset.
      private static int getBitsPerPixel​(java.awt.image.SampleModel sm)
      Returns the number of bits per pixel.
      private static int getDataTypeFromNumBits​(int numBits, boolean isSigned)  
      private static int getDataTypeSize​(int dataType)
      Return the number of bits occupied by dataType which must be one of the DataBuffer TYPEs.
      javax.imageio.ImageTypeSpecifier getRawImageType()
      Returns an ImageTypeSpecifier describing an image whose underlying data array has the same format as the raw source pixel data.
      static javax.imageio.ImageTypeSpecifier getRawImageTypeSpecifier​(int photometricInterpretation, int compression, int samplesPerPixel, int[] bitsPerSample, int[] sampleFormat, int[] extraSamples, char[] colorMap)
      A utility method that returns an ImageTypeSpecifier suitable for decoding an image with the given parameters.
      private static boolean isDataBufferBitContiguous​(java.awt.image.SampleModel sm)
      Determines whether the DataBuffer is filled without any interspersed padding bits.
      private static void reformatData​(byte[] buf, int bytesPerRow, int numRows, short[] shortData, int[] intData, int outOffset, int outStride)
      Reformats data read as bytes into a short or int buffer.
      private static void reformatDiscontiguousData​(byte[] buf, int stride, int w, int h, java.awt.image.WritableRaster raster)
      Reformats bit-discontiguous data into the DataBuffer of the supplied WritableRaster.
      void setActiveSrcHeight​(int activeSrcHeight)
      Sets the value of the activeSrcHeight field.
      void setActiveSrcMinX​(int activeSrcMinX)
      Sets the value of the activeSrcMinX field.
      void setActiveSrcMinY​(int activeSrcMinY)
      Sets the value of the activeSrcMinY field.
      void setActiveSrcWidth​(int activeSrcWidth)
      Sets the value of the activeSrcWidth field.
      void setBitsPerSample​(int[] bitsPerSample)
      Sets the value of the bitsPerSample field.
      void setByteCount​(int byteCount)
      Sets the value of the byteCount field.
      void setColorConverter​(TIFFColorConverter colorConverter)
      Sets the TIFFColorConverter object describing the color space of the encoded data in the input stream.
      void setColorMap​(char[] colorMap)
      Sets the value of the colorMap field.
      void setCompression​(int compression)
      Sets the value of the compression field.
      void setDestinationBands​(int[] destinationBands)
      Sets the value of the destinationBands field.
      void setDstHeight​(int dstHeight)
      Sets the value of the dstHeight field.
      void setDstMinX​(int dstMinX)
      Sets the value of the dstMinX field.
      void setDstMinY​(int dstMinY)
      Sets the value of the dstMinY field.
      void setDstWidth​(int dstWidth)
      Sets the value of the dstWidth field.
      void setDstXOffset​(int dstXOffset)
      Sets the value of the dstXOffset field.
      void setDstYOffset​(int dstYOffset)
      Sets the value of the dstYOffset field.
      void setExtraSamples​(int[] extraSamples)
      Sets the value of the extraSamples field.
      void setImage​(java.awt.image.BufferedImage image)
      Sets the value of the image field.
      void setMetadata​(javax.imageio.metadata.IIOMetadata metadata)
      Sets the value of the metadata field.
      void setOffset​(long offset)
      Sets the value of the offset field.
      void setPhotometricInterpretation​(int photometricInterpretation)
      Sets the value of the photometricInterpretation field.
      void setPlanar​(boolean planar)
      Sets the value of the planar field.
      void setReader​(javax.imageio.ImageReader reader)
      Sets the value of the reader field.
      void setSampleFormat​(int[] sampleFormat)
      Sets the value of the sampleFormat field.
      void setSamplesPerPixel​(int samplesPerPixel)
      Sets the value of the samplesPerPixel field.
      void setSourceBands​(int[] sourceBands)
      Sets the value of the sourceBands field.
      void setSourceXOffset​(int sourceXOffset)
      Sets the value of the sourceXOffset field.
      void setSourceYOffset​(int sourceYOffset)
      Sets the value of the sourceYOffset.
      void setSrcHeight​(int srcHeight)
      Sets the value of the srcHeight field.
      void setSrcMinX​(int srcMinX)
      Sets the value of the srcMinX field.
      void setSrcMinY​(int srcMinY)
      Sets the value of the srcMinY field.
      void setSrcWidth​(int srcWidth)
      Sets the value of the srcWidth field.
      void setStream​(javax.imageio.stream.ImageInputStream stream)
      Sets the value of the stream field.
      void setSubsampleX​(int subsampleX)
      Sets the value of the subsampleX field.
      void setSubsampleY​(int subsampleY)
      Sets the value of the subsampleY field.
      • Methods inherited from class java.lang.Object

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

      • reader

        protected javax.imageio.ImageReader reader
        The ImageReader calling this TIFFDecompressor.
      • metadata

        protected javax.imageio.metadata.IIOMetadata metadata
        The IIOMetadata object containing metadata for the current image.
      • planar

        protected boolean planar
        true if the image is encoded using separate planes.
      • samplesPerPixel

        protected int samplesPerPixel
        The value of the SamplesPerPixel tag.
      • bitsPerSample

        protected int[] bitsPerSample
        The value of the BitsPerSample tag.
      • colorMap

        protected char[] colorMap
        The value of the ColorMap tag.
      • stream

        protected javax.imageio.stream.ImageInputStream stream
        The ImageInputStream containing the TIFF source data.
      • offset

        protected long offset
        The offset in the source ImageInputStream of the start of the data to be decompressed.
      • byteCount

        protected int byteCount
        The number of bytes of data from the source ImageInputStream to be decompressed.
      • srcMinX

        protected int srcMinX
        The X coordinate of the upper-left pixel of the source region being decoded from the source stream. This value is not affected by source subsampling.
      • srcMinY

        protected int srcMinY
        The Y coordinate of the upper-left pixel of the source region being decoded from the source stream. This value is not affected by source subsampling.
      • srcWidth

        protected int srcWidth
        The width of the source region being decoded from the source stream. This value is not affected by source subsampling.
      • srcHeight

        protected int srcHeight
        The height of the source region being decoded from the source stream. This value is not affected by source subsampling.
      • sourceXOffset

        protected int sourceXOffset
        The source X offset used, along with dstXOffset and subsampleX, to map between horizontal source and destination pixel coordinates.
      • dstXOffset

        protected int dstXOffset
        The horizontal destination offset used, along with sourceXOffset and subsampleX, to map between horizontal source and destination pixel coordinates. See the comment for sourceXOffset for the mapping equations.
      • sourceYOffset

        protected int sourceYOffset
        The source Y offset used, along with dstYOffset and subsampleY, to map between vertical source and destination pixel coordinates.
      • dstYOffset

        protected int dstYOffset
        The vertical destination offset used, along with sourceYOffset and subsampleY, to map between horizontal source and destination pixel coordinates. See the comment for sourceYOffset for the mapping equations.
      • subsampleX

        protected int subsampleX
        The horizontal subsampling factor. A factor of 1 means that every column is copied to the destination; a factor of 2 means that every second column is copied, etc.
      • subsampleY

        protected int subsampleY
        The vertical subsampling factor. A factor of 1 means that every row is copied to the destination; a factor of 2 means that every second row is copied, etc.
      • sourceBands

        protected int[] sourceBands
        The sequence of source bands that are to be copied into the destination.
      • destinationBands

        protected int[] destinationBands
        The sequence of destination bands to receive the source data.
      • rawImage

        protected java.awt.image.BufferedImage rawImage
        A BufferedImage for the decodeRaw method to write into.
      • image

        protected java.awt.image.BufferedImage image
        The final destination image.
      • dstMinX

        protected int dstMinX
        The X coordinate of the upper left pixel to be written in the destination image.
      • dstMinY

        protected int dstMinY
        The Y coordinate of the upper left pixel to be written in the destination image.
      • dstWidth

        protected int dstWidth
        The width of the region of the destination image to be written.
      • dstHeight

        protected int dstHeight
        The height of the region of the destination image to be written.
      • activeSrcMinX

        protected int activeSrcMinX
        The X coordinate of the upper-left source pixel that will actually be copied into the destination image, taking into account all subsampling, offsetting, and clipping. That is, the pixel at (activeSrcMinX, activeSrcMinY) is to be copied into the destination pixel at (dstMinX, dstMinY).

        The pixels in the source region to be copied are those with X coordinates of the form activeSrcMinX + k*subsampleX, where k is an integer such that 0 <= k < dstWidth.

      • activeSrcMinY

        protected int activeSrcMinY
        The Y coordinate of the upper-left source pixel that will actually be copied into the destination image, taking into account all subsampling, offsetting, and clipping.

        The pixels in the source region to be copied are those with Y coordinates of the form activeSrcMinY + k*subsampleY, where k is an integer such that 0 <= k < dstHeight.

      • activeSrcWidth

        protected int activeSrcWidth
        The width of the source region that will actually be copied into the destination image, taking into account all susbampling, offsetting, and clipping.

        The active source width will always be equal to (dstWidth - 1)*subsampleX + 1.

      • activeSrcHeight

        protected int activeSrcHeight
        The height of the source region that will actually be copied into the destination image, taking into account all susbampling, offsetting, and clipping.

        The active source height will always be equal to (dstHeight - 1)*subsampleY + 1.

      • colorConverter

        protected TIFFColorConverter colorConverter
        A TIFFColorConverter object describing the color space of the encoded pixel data, or null.
      • isBilevel

        boolean isBilevel
      • isContiguous

        boolean isContiguous
      • isImageSimple

        boolean isImageSimple
      • adjustBitDepths

        boolean adjustBitDepths
      • bitDepthScale

        int[][] bitDepthScale
      • isFirstBitDepthTable

        private boolean isFirstBitDepthTable
      • planarCache

        private boolean planarCache
      • destBitsPerSampleCache

        private int[] destBitsPerSampleCache
      • sourceBandsCache

        private int[] sourceBandsCache
      • bitsPerSampleCache

        private int[] bitsPerSampleCache
      • destinationBandsCache

        private int[] destinationBandsCache
    • Constructor Detail

      • TIFFDecompressor

        public TIFFDecompressor()
    • Method Detail

      • createInterleavedSM

        static java.awt.image.SampleModel createInterleavedSM​(int dataType,
                                                              int numBands)
        Create a PixelInterleavedSampleModel for use in creating an ImageTypeSpecifier. Its dimensions will be 1x1 and it will have ascending band offsets as {0, 1, 2, ..., numBands}.
        Parameters:
        dataType - The data type (DataBuffer.TYPE_*).
        numBands - The number of bands.
        Returns:
        A PixelInterleavedSampleModel.
      • createComponentCM

        static java.awt.image.ColorModel createComponentCM​(java.awt.color.ColorSpace colorSpace,
                                                           int numBands,
                                                           int dataType,
                                                           boolean hasAlpha,
                                                           boolean isAlphaPremultiplied)
        Create a ComponentColorModel for use in creating an ImageTypeSpecifier.
      • createMask

        private static int createMask​(int[] bitsPerSample,
                                      int band)
      • getDataTypeFromNumBits

        private static int getDataTypeFromNumBits​(int numBits,
                                                  boolean isSigned)
      • areIntArraysEqual

        private static boolean areIntArraysEqual​(int[] a,
                                                 int[] b)
      • getDataTypeSize

        private static int getDataTypeSize​(int dataType)
                                    throws javax.imageio.IIOException
        Return the number of bits occupied by dataType which must be one of the DataBuffer TYPEs.
        Throws:
        javax.imageio.IIOException
      • getBitsPerPixel

        private static int getBitsPerPixel​(java.awt.image.SampleModel sm)
        Returns the number of bits per pixel.
      • areSampleSizesEqual

        private static boolean areSampleSizesEqual​(java.awt.image.SampleModel sm)
        Returns whether all samples have the same number of bits.
      • isDataBufferBitContiguous

        private static boolean isDataBufferBitContiguous​(java.awt.image.SampleModel sm)
                                                  throws javax.imageio.IIOException
        Determines whether the DataBuffer is filled without any interspersed padding bits.
        Throws:
        javax.imageio.IIOException
      • reformatData

        private static void reformatData​(byte[] buf,
                                         int bytesPerRow,
                                         int numRows,
                                         short[] shortData,
                                         int[] intData,
                                         int outOffset,
                                         int outStride)
                                  throws javax.imageio.IIOException
        Reformats data read as bytes into a short or int buffer.
        Throws:
        javax.imageio.IIOException
      • reformatDiscontiguousData

        private static void reformatDiscontiguousData​(byte[] buf,
                                                      int stride,
                                                      int w,
                                                      int h,
                                                      java.awt.image.WritableRaster raster)
                                               throws java.io.IOException
        Reformats bit-discontiguous data into the DataBuffer of the supplied WritableRaster.
        Throws:
        java.io.IOException
      • getRawImageTypeSpecifier

        public static javax.imageio.ImageTypeSpecifier getRawImageTypeSpecifier​(int photometricInterpretation,
                                                                                int compression,
                                                                                int samplesPerPixel,
                                                                                int[] bitsPerSample,
                                                                                int[] sampleFormat,
                                                                                int[] extraSamples,
                                                                                char[] colorMap)
        A utility method that returns an ImageTypeSpecifier suitable for decoding an image with the given parameters.
        Parameters:
        photometricInterpretation - the value of the PhotometricInterpretation field.
        compression - the value of the Compression field.
        samplesPerPixel - the value of the SamplesPerPixel field.
        bitsPerSample - the value of the BitsPerSample field.
        sampleFormat - the value of the SampleFormat field.
        extraSamples - the value of the ExtraSamples field.
        colorMap - the value of the ColorMap field.
        Returns:
        a suitable ImageTypeSpecifier, or null if it is not possible to create one.
      • setReader

        public void setReader​(javax.imageio.ImageReader reader)
        Sets the value of the reader field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        reader - the current ImageReader.
      • setMetadata

        public void setMetadata​(javax.imageio.metadata.IIOMetadata metadata)
        Sets the value of the metadata field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        metadata - the IIOMetadata object for the image being read.
      • setPhotometricInterpretation

        public void setPhotometricInterpretation​(int photometricInterpretation)
        Sets the value of the photometricInterpretation field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        photometricInterpretation - the photometric interpretation value.
      • setCompression

        public void setCompression​(int compression)
        Sets the value of the compression field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        compression - the compression type.
      • setPlanar

        public void setPlanar​(boolean planar)
        Sets the value of the planar field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        planar - true if the image to be decoded is stored in planar format.
      • setSamplesPerPixel

        public void setSamplesPerPixel​(int samplesPerPixel)
        Sets the value of the samplesPerPixel field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        samplesPerPixel - the number of samples in each source pixel.
      • setBitsPerSample

        public void setBitsPerSample​(int[] bitsPerSample)
        Sets the value of the bitsPerSample field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        bitsPerSample - the number of bits for each source image sample.
      • setSampleFormat

        public void setSampleFormat​(int[] sampleFormat)
        Sets the value of the sampleFormat field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        sampleFormat - the format of the source image data, for example unsigned integer or floating-point.
      • setExtraSamples

        public void setExtraSamples​(int[] extraSamples)
        Sets the value of the extraSamples field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        extraSamples - the interpretation of any samples in the source file beyond those used for basic color or grayscale information.
      • setColorMap

        public void setColorMap​(char[] colorMap)
        Sets the value of the colorMap field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        colorMap - the color map to apply to the source data, as an array of chars.
      • setStream

        public void setStream​(javax.imageio.stream.ImageInputStream stream)
        Sets the value of the stream field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        stream - the ImageInputStream to be read.
      • setOffset

        public void setOffset​(long offset)
        Sets the value of the offset field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        offset - the offset of the beginning of the compressed data.
      • setByteCount

        public void setByteCount​(int byteCount)
        Sets the value of the byteCount field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        byteCount - the number of bytes of compressed data.
      • setSrcMinX

        public void setSrcMinX​(int srcMinX)
        Sets the value of the srcMinX field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        srcMinX - the minimum X coordinate of the source region being decoded, irrespective of how it will be copied into the destination.
      • setSrcMinY

        public void setSrcMinY​(int srcMinY)
        Sets the value of the srcMinY field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        srcMinY - the minimum Y coordinate of the source region being decoded, irrespective of how it will be copied into the destination.
      • setSrcWidth

        public void setSrcWidth​(int srcWidth)
        Sets the value of the srcWidth field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        srcWidth - the width of the source region being decoded, irrespective of how it will be copied into the destination.
      • setSrcHeight

        public void setSrcHeight​(int srcHeight)
        Sets the value of the srcHeight field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        srcHeight - the height of the source region being decoded, irrespective of how it will be copied into the destination.
      • setSourceXOffset

        public void setSourceXOffset​(int sourceXOffset)
        Sets the value of the sourceXOffset field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        sourceXOffset - the horizontal source offset to be used when mapping between source and destination coordinates.
      • setDstXOffset

        public void setDstXOffset​(int dstXOffset)
        Sets the value of the dstXOffset field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        dstXOffset - the horizontal destination offset to be used when mapping between source and destination coordinates.
      • setSourceYOffset

        public void setSourceYOffset​(int sourceYOffset)
        Sets the value of the sourceYOffset.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        sourceYOffset - the vertical source offset to be used when mapping between source and destination coordinates.
      • setDstYOffset

        public void setDstYOffset​(int dstYOffset)
        Sets the value of the dstYOffset field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        dstYOffset - the vertical destination offset to be used when mapping between source and destination coordinates.
      • setSubsampleX

        public void setSubsampleX​(int subsampleX)
        Sets the value of the subsampleX field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        subsampleX - the horizontal subsampling factor.
        Throws:
        java.lang.IllegalArgumentException - if subsampleX is less than or equal to 0.
      • setSubsampleY

        public void setSubsampleY​(int subsampleY)
        Sets the value of the subsampleY field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        subsampleY - the vertical subsampling factor.
        Throws:
        java.lang.IllegalArgumentException - if subsampleY is less than or equal to 0.
      • setSourceBands

        public void setSourceBands​(int[] sourceBands)
        Sets the value of the sourceBands field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        sourceBands - an array of ints specifying the source bands to be read.
      • setDestinationBands

        public void setDestinationBands​(int[] destinationBands)
        Sets the value of the destinationBands field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        destinationBands - an array of ints specifying the destination bands to be written.
      • setImage

        public void setImage​(java.awt.image.BufferedImage image)
        Sets the value of the image field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        image - the destination BufferedImage.
      • setDstMinX

        public void setDstMinX​(int dstMinX)
        Sets the value of the dstMinX field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        dstMinX - the minimum X coordinate of the destination region.
      • setDstMinY

        public void setDstMinY​(int dstMinY)
        Sets the value of the dstMinY field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        dstMinY - the minimum Y coordinate of the destination region.
      • setDstWidth

        public void setDstWidth​(int dstWidth)
        Sets the value of the dstWidth field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        dstWidth - the width of the destination region.
      • setDstHeight

        public void setDstHeight​(int dstHeight)
        Sets the value of the dstHeight field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        dstHeight - the height of the destination region.
      • setActiveSrcMinX

        public void setActiveSrcMinX​(int activeSrcMinX)
        Sets the value of the activeSrcMinX field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        activeSrcMinX - the minimum X coordinate of the active source region.
      • setActiveSrcMinY

        public void setActiveSrcMinY​(int activeSrcMinY)
        Sets the value of the activeSrcMinY field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        activeSrcMinY - the minimum Y coordinate of the active source region.
      • setActiveSrcWidth

        public void setActiveSrcWidth​(int activeSrcWidth)
        Sets the value of the activeSrcWidth field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        activeSrcWidth - the width of the active source region.
      • setActiveSrcHeight

        public void setActiveSrcHeight​(int activeSrcHeight)
        Sets the value of the activeSrcHeight field.

        If this method is called, the beginDecoding method must be called prior to calling any of the decode methods.

        Parameters:
        activeSrcHeight - the height of the active source region.
      • setColorConverter

        public void setColorConverter​(TIFFColorConverter colorConverter)
        Sets the TIFFColorConverter object describing the color space of the encoded data in the input stream. If no TIFFColorConverter is set, no conversion will be performed.
        Parameters:
        colorConverter - a TIFFColorConverter object, or null.
      • getRawImageType

        public javax.imageio.ImageTypeSpecifier getRawImageType()
        Returns an ImageTypeSpecifier describing an image whose underlying data array has the same format as the raw source pixel data.
        Returns:
        an ImageTypeSpecifier.
      • createRawImage

        public java.awt.image.BufferedImage createRawImage()
        Creates a BufferedImage whose underlying data array will be suitable for holding the raw decoded output of the decodeRaw method.

        The default implementation calls getRawImageType, and calls the resulting ImageTypeSpecifier's createBufferedImage method.

        Returns:
        a BufferedImage whose underlying data array has the same format as the raw source pixel data, or null if it is not possible to create such an image.
      • decodeRaw

        public abstract void decodeRaw​(byte[] b,
                                       int dstOffset,
                                       int bitsPerPixel,
                                       int scanlineStride)
                                throws java.io.IOException
        Decodes the source data into the provided byte array b, starting at the offset given by dstOffset. Each pixel occupies bitsPerPixel bits, with no padding between pixels. Scanlines are separated by scanlineStride bytes.
        Parameters:
        b - a byte array to be written.
        dstOffset - the starting offset in b to be written.
        bitsPerPixel - the number of bits for each pixel.
        scanlineStride - the number of bytes to advance between that starting pixels of each scanline.
        Throws:
        java.io.IOException - if an error occurs reading from the source ImageInputStream.
      • decodeRaw

        public void decodeRaw​(short[] s,
                              int dstOffset,
                              int bitsPerPixel,
                              int scanlineStride)
                       throws java.io.IOException
        Decodes the source data into the provided short array s, starting at the offset given by dstOffset. Each pixel occupies bitsPerPixel bits, with no padding between pixels. Scanlines are separated by scanlineStride shorts

        The default implementation calls decodeRaw(byte[] b, ...) and copies the resulting data into s.

        Parameters:
        s - a short array to be written.
        dstOffset - the starting offset in s to be written.
        bitsPerPixel - the number of bits for each pixel.
        scanlineStride - the number of shorts to advance between that starting pixels of each scanline.
        Throws:
        java.io.IOException - if an error occurs reading from the source ImageInputStream.
      • decodeRaw

        public void decodeRaw​(int[] i,
                              int dstOffset,
                              int bitsPerPixel,
                              int scanlineStride)
                       throws java.io.IOException
        Decodes the source data into the provided int array i, starting at the offset given by dstOffset. Each pixel occupies bitsPerPixel bits, with no padding between pixels. Scanlines are separated by scanlineStride ints.

        The default implementation calls decodeRaw(byte[] b, ...) and copies the resulting data into i.

        Parameters:
        i - an int array to be written.
        dstOffset - the starting offset in i to be written.
        bitsPerPixel - the number of bits for each pixel.
        scanlineStride - the number of ints to advance between that starting pixels of each scanline.
        Throws:
        java.io.IOException - if an error occurs reading from the source ImageInputStream.
      • decodeRaw

        public void decodeRaw​(float[] f,
                              int dstOffset,
                              int bitsPerPixel,
                              int scanlineStride)
                       throws java.io.IOException
        Decodes the source data into the provided float array f, starting at the offset given by dstOffset. Each pixel occupies bitsPerPixel bits, with no padding between pixels. Scanlines are separated by scanlineStride floats.

        The default implementation calls decodeRaw(byte[] b, ...) and copies the resulting data into f.

        Parameters:
        f - a float array to be written.
        dstOffset - the starting offset in f to be written.
        bitsPerPixel - the number of bits for each pixel.
        scanlineStride - the number of floats to advance between that starting pixels of each scanline.
        Throws:
        java.io.IOException - if an error occurs reading from the source ImageInputStream.
      • beginDecoding

        public void beginDecoding()
        This routine is called prior to a sequence of calls to the decode method, in order to allow any necessary tables or other structures to be initialized based on metadata values. This routine is guaranteed to be called any time the metadata values have changed.

        The default implementation computes tables used by the decode method to rescale components to different bit depths. Thus, if this method is overridden, it is important for the subclass method to call super(), unless it overrides decode as well.

      • decode

        public void decode()
                    throws java.io.IOException
        Decodes the input bit stream (located in the ImageInputStream stream, at offset offset, and continuing for byteCount bytes) into the output BufferedImage image.

        The default implementation analyzes the destination image to determine if it is suitable as the destination for the decodeRaw method. If not, a suitable image is created. Next, decodeRaw is called to perform the actual decoding, and the results are copied into the destination image if necessary. Subsampling and offsetting are performed automatically.

        The precise responsibilities of this routine are as follows. The input bit stream is defined by the instance variables stream, offset, and byteCount. These bits contain the data for the region of the source image defined by srcMinX, srcMinY, srcWidth, and srcHeight.

        The source data is required to be subsampling, starting at the sourceXOffsetth column and including every subsampleXth pixel thereafter (and similarly for sourceYOffset and subsampleY).

        Pixels are copied into the destination with an addition shift of (dstXOffset, dstYOffset). The complete set of formulas relating the source and destination coordinate spaces are:

         dx = (sx - sourceXOffset)/subsampleX + dstXOffset;
         dy = (sy - sourceYOffset)/subsampleY + dstYOffset; 
         
        Only source pixels such that (sx - sourceXOffset) % subsampleX == 0 and (sy - sourceYOffset) % subsampleY == 0 are copied.

        The inverse mapping, from destination to source coordinates, is one-to-one:

         sx = (dx - dstXOffset)*subsampleX + sourceXOffset;
         sy = (dy - dstYOffset)*subsampleY + sourceYOffset;
         

        The region of the destination image to be updated is given by the instance variables dstMinX, dstMinY, dstWidth, and dstHeight.

        It is possible that not all of the source data being read will contribute to the destination image. For example, the destination offsets could be set such that some of the source pixels land outside of the bounds of the image. As a convenience, the bounds of the active source region (that is, the region of the strip or tile being read that actually contributes to the destination image, taking clipping into account) are available as activeSrcMinX, activeSrcMinY, activeSrcWidth and activeSrcHeight. Thus, the source pixel at (activeSrcMinX, activeSrcMinY) will map to the destination pixel (dstMinX, dstMinY).

        The sequence of source bands given by sourceBands are to be copied into the sequence of bands in the destination given by destinationBands.

        Some standard tag information is provided the instance variables photometricInterpretation, compression, samplesPerPixel, bitsPerSample, sampleFormat, extraSamples, and colorMap.

        In practice, unless there is a significant performance advantage to be gained by overriding this routine, most users will prefer to use the default implementation of this routine, and instead override the decodeRaw and/or getRawImageType methods.

        Throws:
        java.io.IOException - if an error occurs in decodeRaw.