You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
171 lines
6.9 KiB
171 lines
6.9 KiB
5 years ago
|
/*
|
||
|
* Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
|
||
|
*
|
||
|
* Redistribution and use in source and binary forms, with or without
|
||
|
* modification, are permitted provided that the following conditions are met:
|
||
|
*
|
||
|
* -Redistributions of source code must retain the above copyright notice, this
|
||
|
* list of conditions and the following disclaimer.
|
||
|
*
|
||
|
* -Redistribution in binary form must reproduct the above copyright notice,
|
||
|
* this list of conditions and the following disclaimer in the documentation
|
||
|
* and/or other materials provided with the distribution.
|
||
|
*
|
||
|
* Neither the name of Sun Microsystems, Inc. or the names of contributors may
|
||
|
* be used to endorse or promote products derived from this software without
|
||
|
* specific prior written permission.
|
||
|
*
|
||
|
* This software is provided "AS IS," without a warranty of any kind. ALL
|
||
|
* EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
|
||
|
* IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
|
||
|
* NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
|
||
|
* LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
|
||
|
* OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
|
||
|
* LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
|
||
|
* INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
|
||
|
* CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
|
||
|
* OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
|
||
|
* POSSIBILITY OF SUCH DAMAGES.
|
||
|
*
|
||
|
* You acknowledge that Software is not designed,licensed or intended for use in
|
||
|
* the design, construction, operation or maintenance of any nuclear facility.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* An instance of <code>ImageDecodeParam</code> for decoding images in
|
||
|
* the TIFF format.
|
||
|
*
|
||
|
* <p> To determine the number of images present in a TIFF file, use
|
||
|
* the <code>getNumPages()</code> method on the
|
||
|
* <code>ImageDecoder</code> object that will be used to perform the
|
||
|
* decoding. The desired page number may be passed as an argument to
|
||
|
* the <code>ImageDecoder.decodeAsRaster)()</code> or
|
||
|
* <code>decodeAsRenderedImage()</code> methods.
|
||
|
*
|
||
|
* <p> For TIFF Palette color images, the colorMap always has entries
|
||
|
* of short data type, the color Black being represented by 0,0,0 and
|
||
|
* White by 65536,65536,65536. In order to display these images, the
|
||
|
* default behavior is to dither the short values down to 8 bits.
|
||
|
* The dithering is done by calling the <code>decode16BitsTo8Bits</code>
|
||
|
* method for each short value that needs to be dithered. The method has
|
||
|
* the following implementation:
|
||
|
* <code>
|
||
|
* byte b;
|
||
|
* short s;
|
||
|
* s = s & 0xffff;
|
||
|
* b = (byte)((s >> 8) & 0xff);
|
||
|
* </code>
|
||
|
* If a different algorithm is to be used for the dithering, this class
|
||
|
* should be subclassed and an appropriate implementation should be
|
||
|
* provided for the <code>decode16BitsTo8Bits</code> method in the subclass.
|
||
|
*
|
||
|
* <p>If the palette contains image data that is signed short, as specified
|
||
|
* by the SampleFormat tag, the dithering is done by calling
|
||
|
* <code>decodeSigned16BitsTo8Bits</code> instead. The method has the
|
||
|
* following implementation:
|
||
|
* <code>
|
||
|
* byte b;
|
||
|
* short s;
|
||
|
* b = (byte)((s + Short.MIN_VALUE) >> 8);
|
||
|
* </code>
|
||
|
* In order to use a different algorithm for the dithering, this class
|
||
|
* should be subclassed and the method overridden.
|
||
|
*
|
||
|
* <p> If it is desired that the Palette be decoded such that the output
|
||
|
* image is of short data type and no dithering is performed, the
|
||
|
* <code>setDecodePaletteAsShorts</code> method should be used.
|
||
|
*
|
||
|
* <p><b> This class is not a committed part of the JAI API. It may
|
||
|
* be removed or changed in future releases of JAI.</b>
|
||
|
*
|
||
|
* @see TIFFDirectory
|
||
|
*/
|
||
|
package com.fr.third.JAI;
|
||
|
public class TIFFDecodeParam implements ImageDecodeParam {
|
||
|
|
||
|
private boolean decodePaletteAsShorts = false;
|
||
|
private Long ifdOffset = null;
|
||
|
private boolean convertJPEGYCbCrToRGB = true;
|
||
|
|
||
|
/** Constructs a default instance of <code>TIFFDecodeParam</code>. */
|
||
|
public TIFFDecodeParam() {
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* If set, the entries in the palette will be decoded as shorts
|
||
|
* and no short to byte lookup will be applied to them.
|
||
|
*/
|
||
|
public void setDecodePaletteAsShorts(boolean decodePaletteAsShorts) {
|
||
|
this.decodePaletteAsShorts = decodePaletteAsShorts;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns <code>true</code> if palette entries will be decoded as
|
||
|
* shorts, resulting in an output image with short datatype.
|
||
|
*/
|
||
|
public boolean getDecodePaletteAsShorts() {
|
||
|
return decodePaletteAsShorts;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unsigned 8 bit value computed by dithering the unsigned
|
||
|
* 16 bit value. Note that the TIFF specified short datatype is an
|
||
|
* unsigned value, while Java's <code>short</code> datatype is a
|
||
|
* signed value. Therefore the Java <code>short</code> datatype cannot
|
||
|
* be used to store the TIFF specified short value. A Java
|
||
|
* <code>int</code> is used as input instead to this method. The method
|
||
|
* deals correctly only with 16 bit unsigned values.
|
||
|
*/
|
||
|
public byte decode16BitsTo8Bits(int s) {
|
||
|
return (byte)((s >> 8) & 0xffff);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns an unsigned 8 bit value computed by dithering the signed
|
||
|
* 16 bit value. This method deals correctly only with values in the
|
||
|
* 16 bit signed range.
|
||
|
*/
|
||
|
public byte decodeSigned16BitsTo8Bits(short s) {
|
||
|
return (byte)((s + Short.MIN_VALUE) >> 8);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the offset in the stream from which to read the image. There
|
||
|
* must be an Image File Directory (IFD) at that position or an error
|
||
|
* will occur. If <code>setIFDOffset()</code> is never invoked then
|
||
|
* the decoder will assume that the TIFF stream is at the beginning of
|
||
|
* the 8-byte image header. If the directory offset is set and a page
|
||
|
* number is supplied to the TIFF <code>ImageDecoder</code> then the
|
||
|
* page will be the zero-relative index of the IFD in linked list of
|
||
|
* IFDs beginning at the specified offset with a page of zero indicating
|
||
|
* the directory at that offset.
|
||
|
*/
|
||
|
public void setIFDOffset(long offset) {
|
||
|
ifdOffset = new Long(offset);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the value set by <code>setIFDOffset()</code> or
|
||
|
* <code>null</code> if no value has been set.
|
||
|
*/
|
||
|
public Long getIFDOffset() {
|
||
|
return ifdOffset;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets a flag indicating whether to convert JPEG-compressed YCbCr data
|
||
|
* to RGB. The default value is <code>true</code>. This flag is
|
||
|
* ignored if the image data are not JPEG-compressed.
|
||
|
*/
|
||
|
public void setJPEGDecompressYCbCrToRGB(boolean convertJPEGYCbCrToRGB) {
|
||
|
this.convertJPEGYCbCrToRGB = convertJPEGYCbCrToRGB;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Whether JPEG-compressed YCbCr data will be converted to RGB.
|
||
|
*/
|
||
|
public boolean getJPEGDecompressYCbCrToRGB() {
|
||
|
return convertJPEGYCbCrToRGB;
|
||
|
}
|
||
|
}
|