帆软使用的第三方框架。
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.
 
 

424 lines
16 KiB

/*
* 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.
*/
package com.fr.third.JAI;
import java.util.Iterator;
import java.util.zip.Deflater;
/**
* An instance of <code>ImageEncodeParam</code> for encoding images in
* the TIFF format.
*
* <p> This class allows for the specification of encoding parameters. By
* default, the image is encoded without any compression, and is written
* out consisting of strips, not tiles. The particular compression scheme
* to be used can be specified by using the <code>setCompression()</code>
* method. The compression scheme specified will be honored only if it is
* compatible with the type of image being written out. For example,
* Group3 and Group4 compressions can only be used with Bilevel images.
* Writing of tiled TIFF images can be enabled by calling the
* <code>setWriteTiled()</code> method.
*
* <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>
*
*/
public class TIFFEncodeParam implements ImageEncodeParam {
/** No compression. */
public static final int COMPRESSION_NONE = 1;
/** Byte-oriented run-length encoding "PackBits" compression. */
public static final int COMPRESSION_PACKBITS = 32773;
/**
* Modified Huffman Compression (CCITT Run Length Encoding (RLE)).
*/
public static final int COMPRESSION_GROUP3_1D = 2;
/**
* CCITT T.4 bilevel compression (Group 3 facsimile compression).
*/
public static final int COMPRESSION_GROUP3_2D = 3;
/**
* CCITT T.6 bilevel compression (Group 4 facsimile compression).
*/
public static final int COMPRESSION_GROUP4 = 4;
/**
* LZW compression.
* <p><b>Not supported.</b>
*/
public static final int COMPRESSION_LZW = 5;
/**
* <a href="ftp://ftp.sgi.com/graphics/tiff/TTN2.draft.txt">
* JPEG-in-TIFF</a> compression.
*/
public static final int COMPRESSION_JPEG_TTN2 = 7;
/**
* <a href="http://info.internet.isi.edu:80/in-notes/rfc/files/rfc1951.txt">
* DEFLATE</a> lossless compression (also known as "Zip-in-TIFF").
*/
public static final int COMPRESSION_DEFLATE = 32946;
private int compression = COMPRESSION_NONE;
private boolean reverseFillOrder = false;
private boolean T4Encode2D = true;
private boolean T4PadEOLs = false;
private boolean writeTiled = false;
private int tileWidth;
private int tileHeight;
private Iterator extraImages;
private TIFFField[] extraFields;
private boolean convertJPEGRGBToYCbCr = true;
private JPEGEncodeParam jpegEncodeParam = null;
private int deflateLevel = Deflater.DEFAULT_COMPRESSION;
/**
* Constructs a TIFFEncodeParam object with default values for
* all parameters.
*/
public TIFFEncodeParam() {}
/**
* Returns the value of the compression parameter.
*/
public int getCompression() {
return compression;
}
/**
* Specifies the type of compression to be used. The compression type
* specified will be honored only if it is compatible with the image
* being written out. Currently only PackBits, JPEG, and DEFLATE
* compression schemes are supported.
*
* <p> If <code>compression</code> is set to any value but
* <code>COMPRESSION_NONE</code> and the <code>OutputStream</code>
* supplied to the <code>ImageEncoder</code> is not a
* <code>SeekableOutputStream</code>, then the encoder will use either
* a temporary file or a memory cache when compressing the data
* depending on whether the file system is accessible. Compression
* will therefore be more efficient if a <code>SeekableOutputStream</code>
* is supplied.
*
* @param compression The compression type.
*/
public void setCompression(int compression) {
switch(compression) {
case COMPRESSION_NONE:
case COMPRESSION_GROUP3_1D:
case COMPRESSION_GROUP3_2D:
case COMPRESSION_GROUP4:
case COMPRESSION_PACKBITS:
case COMPRESSION_JPEG_TTN2:
case COMPRESSION_DEFLATE:
// Do nothing.
break;
default:
throw new Error(JaiI18N.getString("TIFFEncodeParam0"));
}
this.compression = compression;
}
/**
* Returns value of flag indicating whether CCITT-compressed bilevel
* data should be filled in reverse order.
*
* @see #setReverseFillOrder
*/
public boolean getReverseFillOrder() {
return reverseFillOrder;
}
/**
* Set value of flag indicating whether CCITT-compressed bilevel
* data should be filled in reverse order. If <code>true</code>,
* pixels are arranged within a byte such that pixels with lower
* column values are stored in the lower order bits of the byte.
* Thus <code>true</code> corresponds to TIFF FillOrder value 2
* and <code>false</code> to TIFF FillOrder 1. The default
* value is <code>false</code>.
*/
public void setReverseFillOrder(boolean reverseFillOrder) {
this.reverseFillOrder = reverseFillOrder;
}
/**
* Returns value of flag indicating whether T4-compressed bilevel data
* should be two-dimensionally encoded.
*
* @see #setT4Encode2D
*/
public boolean getT4Encode2D() {
return T4Encode2D;
}
/**
* Set value of flag indicating whether T4-compressed bilevel data
* should be two-dimensionally encoded. If <code>true</code> the
* data are two-dimensionally encoded; if <code>false</code> they
* are one-dimensionally encoded. The default value is <code>true</code>.
*/
public void setT4Encode2D(boolean T4Encode2D) {
this.T4Encode2D = T4Encode2D;
}
/**
* Returns value of flag indicating whether T4-compressed bilevel data
* should have the embedded EOL bit sequences padded to byte alignment.
*
* @see #setT4PadEOLs
*/
public boolean getT4PadEOLs() {
return T4PadEOLs;
}
/**
* Sets value of flag indicating whether T4-compressed bilevel data
* should have the embedded EOL bit sequences padded to byte alignment.
* If <code>true</code>, zero-valued bits are prepended to each EOL
* bit sequence <code>0x001</code> such that the EOL is right-aligned
* on a byte boundary:
*
* <pre>
* xxxx-0000 0000-0001
* </pre>
*
* where "x" denotes a value which could be either data or a fill bit
* depending on the alignment of the data before the EOL. The default
* value is <code>false</code>.
*/
public void setT4PadEOLs(boolean T4PadEOLs) {
this.T4PadEOLs = T4PadEOLs;
}
/**
* Returns the value of the writeTiled parameter.
*/
public boolean getWriteTiled() {
return writeTiled;
}
/**
* If set, the data will be written out in tiled format, instead of
* in strips.
*
* @param writeTiled Specifies whether the image data should be
* wriiten out in tiled format.
*/
public void setWriteTiled(boolean writeTiled) {
this.writeTiled = writeTiled;
}
/**
* Sets the dimensions of the tiles to be written. If either
* value is non-positive, the encoder will use a default value.
*
* <p> If the data are being written as tiles, i.e.,
* <code>getWriteTiled()</code> returns <code>true</code>, then the
* default tile dimensions used by the encoder are those of the tiles
* of the image being encoded.
*
* <p> If the data are being written as strips, i.e.,
* <code>getWriteTiled()</code> returns <code>false</code>, the width
* of each strip is always the width of the image and the default
* number of rows per strip is 8.
*
* <p> If JPEG compession is being used, the dimensions of the strips or
* tiles may be modified to conform to the JPEG-in-TIFF specification.
*
* @param tileWidth The tile width; ignored if strips are used.
* @param tileHeight The tile height or number of rows per strip.
*/
public void setTileSize(int tileWidth, int tileHeight) {
this.tileWidth = tileWidth;
this.tileHeight = tileHeight;
}
/**
* Retrieves the tile width set via <code>setTileSize()</code>.
*/
public int getTileWidth() {
return tileWidth;
}
/**
* Retrieves the tile height set via <code>setTileSize()</code>.
*/
public int getTileHeight() {
return tileHeight;
}
/**
* Sets an <code>Iterator</code> of additional images to be written
* after the image passed as an argument to the <code>ImageEncoder</code>.
* The methods on the supplied <code>Iterator</code> must only be invoked
* by the <code>ImageEncoder</code> which will exhaust the available
* values unless an error occurs.
*
* <p> The value returned by an invocation of <code>next()</code> on the
* <code>Iterator</code> must return either a <code>RenderedImage</code>
* or an <code>Object[]</code> of length 2 wherein the element at index
* zero is a <code>RenderedImage</code> amd the other element is a
* <code>TIFFEncodeParam</code>. If no <code>TIFFEncodeParam</code> is
* supplied in this manner for an additional image, the parameters used
* to create the <code>ImageEncoder</code> will be used. The extra
* image <code>Iterator</code> set on any <code>TIFFEncodeParam</code>
* of an additional image will in all cases be ignored.
*/
public synchronized void setExtraImages(Iterator extraImages) {
this.extraImages = extraImages;
}
/**
* Returns the additional image <code>Iterator</code> specified via
* <code>setExtraImages()</code> or <code>null</code> if none was
* supplied or if a <code>null</code> value was supplied.
*/
public synchronized Iterator getExtraImages() {
return extraImages;
}
/**
* Sets the compression level for DEFLATE-compressed data which should
* either be <code>java.util.Deflater.DEFAULT_COMPRESSION</code> or a
* value in the range [1,9] where larger values indicate more compression.
* The default setting is <code>Deflater.DEFAULT_COMPRESSION</code>. This
* setting is ignored if the compression type is not DEFLATE.
*/
public void setDeflateLevel(int deflateLevel) {
if(deflateLevel < 1 && deflateLevel > 9 &&
deflateLevel != Deflater.DEFAULT_COMPRESSION) {
throw new Error(JaiI18N.getString("TIFFEncodeParam1"));
}
this.deflateLevel = deflateLevel;
}
/**
* Gets the compression level for DEFLATE compression.
*/
public int getDeflateLevel() {
return deflateLevel;
}
/**
* Sets flag indicating whether to convert RGB data to YCbCr when the
* compression type is JPEG. The default value is <code>true</code>.
* This flag is ignored if the compression type is not JPEG.
*/
public void setJPEGCompressRGBToYCbCr(boolean convertJPEGRGBToYCbCr) {
this.convertJPEGRGBToYCbCr = convertJPEGRGBToYCbCr;
}
/**
* Whether RGB data will be converted to YCbCr when using JPEG compression.
*/
public boolean getJPEGCompressRGBToYCbCr() {
return convertJPEGRGBToYCbCr;
}
/**
* Sets the JPEG compression parameters. These parameters are ignored
* if the compression type is not JPEG. The argument may be
* <code>null</code> to indicate that default compression parameters
* are to be used. For maximum conformance with the specification it
* is recommended in most cases that only the quality compression
* parameter be set.
*
* <p> The <code>writeTablesOnly</code> and <code>JFIFHeader</code>
* flags of the <code>JPEGEncodeParam</code> are ignored. The
* <code>writeImageOnly</code> flag is used to determine whether the
* JPEGTables field will be written to the TIFF stream: if
* <code>writeImageOnly</code> is <code>true</code>, then the JPEGTables
* field will be written and will contain a valid JPEG abbreviated
* table specification datastream. In this case the data in each data
* segment (strip or tile) will contain an abbreviated JPEG image
* datastream. If the <code>writeImageOnly</code> flag is
* <code>false</code>, then the JPEGTables field will not be written and
* each data segment will contain a complete JPEG interchange datastream.
*/
public void setJPEGEncodeParam(JPEGEncodeParam jpegEncodeParam) {
if(jpegEncodeParam != null) {
jpegEncodeParam = (JPEGEncodeParam)jpegEncodeParam.clone();
jpegEncodeParam.setWriteTablesOnly(false);
jpegEncodeParam.setWriteJFIFHeader(false);
}
this.jpegEncodeParam = jpegEncodeParam;
}
/**
* Retrieves the JPEG compression parameters.
*/
public JPEGEncodeParam getJPEGEncodeParam() {
if(jpegEncodeParam == null) {
jpegEncodeParam = new JPEGEncodeParam();
jpegEncodeParam.setWriteTablesOnly(false);
jpegEncodeParam.setWriteImageOnly(true);
jpegEncodeParam.setWriteJFIFHeader(false);
}
return jpegEncodeParam;
}
/**
* Sets an array of extra fields to be written to the TIFF Image File
* Directory (IFD). Fields with tags equal to the tag of any
* automatically generated fields are ignored. No error checking is
* performed with respect to the validity of the field contents or
* the appropriateness of the field for the image being encoded.
*
* @param extraFields An array of extra fields; the parameter is
* copied by reference.
*/
public void setExtraFields(TIFFField[] extraFields) {
this.extraFields = extraFields;
}
/**
* Returns the value set by <code>setExtraFields()</code>.
*/
public TIFFField[] getExtraFields() {
return extraFields;
}
}