Class TIFFImageReader
- java.lang.Object
-
- javax.imageio.ImageReader
-
- com.twelvemonkeys.imageio.ImageReaderBase
-
- com.twelvemonkeys.imageio.plugins.tiff.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
- 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
-
-
Field Summary
Fields Modifier and Type Field Description private static java.util.Set<java.lang.String>
BYTE_TO_UNDEFINED_NODES
(package private) static double[]
CCIR_601_1_COEFFICIENTS
private Directory
currentIFD
(package private) static boolean
DEBUG
private CompoundDirectory
IFDs
private int
overrideCCITTCompression
(package private) static double[]
REFERENCE_BLACK_WHITE_YCC_DEFAULT
-
Fields inherited from class com.twelvemonkeys.imageio.ImageReaderBase
imageInput
-
-
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 returnsnull
.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 returns1
.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 returnsnull
.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 com.twelvemonkeys.imageio.ImageReaderBase
assertInput, checkBounds, dispose, fakeAOI, fakeSubsampling, getDestination, hasExplicitDestination, reset, setInput
-
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
-
-
-
-
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
-
IFDs
private CompoundDirectory IFDs
-
currentIFD
private Directory currentIFD
-
overrideCCITTCompression
private int overrideCCITTCompression
-
BYTE_TO_UNDEFINED_NODES
private static final java.util.Set<java.lang.String> BYTE_TO_UNDEFINED_NODES
-
-
Method Detail
-
resetMembers
protected void resetMembers()
Description copied from class:ImageReaderBase
Resets all member variables. This method is by default invoked from:- Specified by:
resetMembers
in classImageReaderBase
-
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 returns1
.- Overrides:
getNumImages
in classImageReaderBase
- 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 classjavax.imageio.ImageReader
- Throws:
java.io.IOException
-
getHeight
public int getHeight(int imageIndex) throws java.io.IOException
- Specified by:
getHeight
in classjavax.imageio.ImageReader
- Throws:
java.io.IOException
-
getRawImageType
public javax.imageio.ImageTypeSpecifier getRawImageType(int imageIndex) throws java.io.IOException
- Overrides:
getRawImageType
in classjavax.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 classjavax.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 classjavax.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 classjavax.imageio.ImageReader
-
readRaster
public java.awt.image.Raster readRaster(int imageIndex, javax.imageio.ImageReadParam param) throws java.io.IOException
- Overrides:
readRaster
in classjavax.imageio.ImageReader
- Throws:
java.io.IOException
-
isImageTiled
public boolean isImageTiled(int imageIndex) throws java.io.IOException
- Overrides:
isImageTiled
in classjavax.imageio.ImageReader
- Throws:
java.io.IOException
-
getTileWidth
public int getTileWidth(int imageIndex) throws java.io.IOException
- Overrides:
getTileWidth
in classjavax.imageio.ImageReader
- Throws:
java.io.IOException
-
getTileHeight
public int getTileHeight(int imageIndex) throws java.io.IOException
- Overrides:
getTileHeight
in classjavax.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 classjavax.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 classjavax.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 returnsnull
.- Overrides:
getImageMetadata
in classImageReaderBase
- 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 returnsnull
.- Overrides:
getStreamMetadata
in classImageReaderBase
- 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)
-
-