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_COEFFICIENTSprivate DirectorycurrentIFD(package private) static booleanDEBUGprivate CompoundDirectoryIFDsprivate intoverrideCCITTCompression(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 booleancanReadRaster()private voidclamp(double[] data)private voidclamp(float[] data)private shortclampShort(int val)private java.awt.image.RasterclipRowToRect(java.awt.image.Raster raster, java.awt.Rectangle rect, int[] bands, int xSub)private java.awt.image.WritableRasterclipToRect(java.awt.image.WritableRaster raster, java.awt.Rectangle rect, int[] bands)private java.awt.RectanglecomputeTileRegion(int imageIndex, int tileX, int tileY)private booleancontainsZero(long[] byteCounts)private voidconvertYCbCr2RGB(short[] yCbCr, short[] rgb, double[] coefficients, double[] referenceBW, int offset)private java.io.InputStreamcreateDecompressorStream(int compression, int width, int height, int bands, java.io.InputStream stream)private java.io.InputStreamcreateFillOrderStream(int fillOrder, java.io.InputStream stream)private javax.imageio.ImageTypeSpecifiercreateImageTypeSpecifier(int planarConfiguration, java.awt.color.ColorSpace cs, int dataType, int significantSamples, int samplesPerPixel, boolean alpha, boolean alphaPremultiplied)private java.awt.image.IndexColorModelcreateIndexColorModel(int bitsPerSample, int dataType, int[] cmapShort)private static java.io.InputStreamcreateJFIFStream(int bands, int stripTileWidth, int stripTileHeight, byte[][] qTables, byte[][] dcTables, byte[][] acTables, int subsampling)private javax.imageio.ImageReadercreateJPEGDelegate()(package private) static int[]createOffsets(int samplesPerPixel)private java.io.InputStreamcreateUnpredictorStream(int predictor, int width, int samplesPerPixel, int bitsPerSample, java.io.InputStream stream, java.nio.ByteOrder byteOrder)private java.io.InputStreamcreateYCbCrUpsamplerStream(int photometricInterpretation, int planarConfiguration, int plane, int transferType, int[] yCbCrSubsampling, int yCbCrPos, int colsInTile, java.io.InputStream stream, java.nio.ByteOrder byteOrder)private intfindCCITTType(int encodedCompression, java.io.InputStream stream)private intgetBitsPerSample()private longgetCCITTOptions(int compression)private intgetDataType(int sampleFormat, int bitsPerSample)intgetHeight(int imageIndex)private java.awt.color.ICC_ProfilegetICCProfile()javax.imageio.metadata.IIOMetadatagetImageMetadata(int imageIndex)Default implementation that always returnsnull.java.util.Iterator<javax.imageio.ImageTypeSpecifier>getImageTypes(int imageIndex)private intgetJPEGSourceCS(javax.imageio.metadata.IIOMetadata imageMetadata)private javax.imageio.metadata.IIOMetadataNodegetNode(javax.imageio.metadata.IIOMetadataNode parent, java.lang.String tagName)intgetNumImages(boolean allowSearch)Default implementation that always returns1.private intgetOpaqueSamplesPerPixel(int photometricInterpretation)private intgetPhotometricInterpretationWithFallback()javax.imageio.ImageTypeSpecifiergetRawImageType(int imageIndex)private intgetSampleFormat()javax.imageio.metadata.IIOMetadatagetStreamMetadata()Default implementation that always returnsnull.intgetTileHeight(int imageIndex)intgetTileWidth(int imageIndex)private double[]getValueAsDoubleArray(int tag, java.lang.String tagName, boolean required, int expectedLength)private intgetValueAsInt(int tag, java.lang.String tagName)private intgetValueAsIntWithDefault(int tag, java.lang.Integer defaultValue)private intgetValueAsIntWithDefault(int tag, java.lang.String tagName, java.lang.Integer defaultValue)private long[]getValueAsLongArray(int tag, java.lang.String tagName, boolean required)private longgetValueAsLongWithDefault(int tag, java.lang.Long defaultValue)private longgetValueAsLongWithDefault(int tag, java.lang.String tagName, java.lang.Long defaultValue)private java.lang.NumbergetValueAsNumberWithDefault(int tag, java.lang.String tagName, java.lang.Number defaultValue)intgetWidth(int imageIndex)(package private) static intguessPhotometricInterpretation(int compression, int samplesPerPixel, Entry extraSamples, Entry colorMap)(package private) static java.lang.StringintToStr(int value)booleanisImageTiled(int imageIndex)static voidmain(java.lang.String[] args)private booleanneedsCSConversion(int compression, int photometricInterpretation, javax.imageio.metadata.IIOMetadata imageMetadata)private voidnormalizeColor(int photometricInterpretation, int numBands, byte[] data)private voidnormalizeColor(int photometricInterpretation, int numBands, double[] data)private voidnormalizeColor(int photometricInterpretation, int numBands, float[] data)private voidnormalizeColor(int photometricInterpretation, int numBands, int[] data)private voidnormalizeColor(int photometricInterpretation, int numBands, short[] data)private voidnormalizeColorPlanar(int photometricInterpretation, java.awt.image.WritableRaster raster)java.awt.image.BufferedImageread(int imageIndex, javax.imageio.ImageReadParam param)private java.awt.image.BufferedImageread(int imageIndex, javax.imageio.ImageReadParam param, boolean normalize)private voidreadIFD(int imageIndex)private javax.imageio.metadata.IIOMetadatareadJPEGMetadataSafe(javax.imageio.ImageReader jpegReader)private voidreadMetadata()(package private) static java.lang.StringreadPascalString(java.io.DataInput pInput)java.awt.image.RasterreadRaster(int imageIndex, javax.imageio.ImageReadParam param)private voidreadStripTileData(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, boolean normalize)java.awt.image.BufferedImagereadTile(int imageIndex, int tileX, int tileY)java.awt.image.RasterreadTileRaster(int imageIndex, int tileX, int tileY)private static voidreplaceBytesWithUndefined(javax.imageio.metadata.IIOMetadataNode tree)protected voidresetMembers()Resets all member variables.protected static voidshowIt(java.awt.image.BufferedImage image, java.lang.String title)private voidtoFloat(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:ImageReaderBaseResets all member variables. This method is by default invoked from:- Specified by:
resetMembersin 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.IOExceptionDescription copied from class:ImageReaderBaseDefault implementation that always returns1.- Overrides:
getNumImagesin 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:
getWidthin classjavax.imageio.ImageReader- Throws:
java.io.IOException
-
getHeight
public int getHeight(int imageIndex) throws java.io.IOException- Specified by:
getHeightin classjavax.imageio.ImageReader- Throws:
java.io.IOException
-
getRawImageType
public javax.imageio.ImageTypeSpecifier getRawImageType(int imageIndex) throws java.io.IOException- Overrides:
getRawImageTypein 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
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:
getImageTypesin 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:
readin classjavax.imageio.ImageReader- Throws:
java.io.IOException
-
read
private java.awt.image.BufferedImage read(int imageIndex, javax.imageio.ImageReadParam param, boolean normalize) throws java.io.IOException- 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, boolean normalize) throws java.io.IOException- Throws:
java.io.IOException
-
toFloat
private void toFloat(short[] rowDataShort, float[] rowDataFloat)
-
clamp
private void clamp(float[] data)
-
clamp
private void clamp(double[] data)
-
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)
-
normalizeColor
private void normalizeColor(int photometricInterpretation, int numBands, double[] 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 height, 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:
canReadRasterin classjavax.imageio.ImageReader
-
readRaster
public java.awt.image.Raster readRaster(int imageIndex, javax.imageio.ImageReadParam param) throws java.io.IOException- Overrides:
readRasterin classjavax.imageio.ImageReader- Throws:
java.io.IOException
-
isImageTiled
public boolean isImageTiled(int imageIndex) throws java.io.IOException- Overrides:
isImageTiledin classjavax.imageio.ImageReader- Throws:
java.io.IOException
-
getTileWidth
public int getTileWidth(int imageIndex) throws java.io.IOException- Overrides:
getTileWidthin classjavax.imageio.ImageReader- Throws:
java.io.IOException
-
getTileHeight
public int getTileHeight(int imageIndex) throws java.io.IOException- Overrides:
getTileHeightin 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:
readTilein 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:
readTileRasterin classjavax.imageio.ImageReader- Throws:
java.io.IOException
-
getImageMetadata
public javax.imageio.metadata.IIOMetadata getImageMetadata(int imageIndex) throws java.io.IOExceptionDescription copied from class:ImageReaderBaseDefault implementation that always returnsnull.- Overrides:
getImageMetadatain 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.IOExceptionDescription copied from class:ImageReaderBaseDefault implementation that always returnsnull.- Overrides:
getStreamMetadatain 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)
-
-