TIFFEncodeParam.java
上传用户:btjssb159
上传日期:2018-01-04
资源大小:241k
文件大小:13k
源码类别:

DNA

开发平台:

Java

  1. /*
  2.  * Copyright (c) 2001 Sun Microsystems, Inc. All Rights Reserved.
  3.  *
  4.  * Redistribution and use in source and binary forms, with or without 
  5.  * modification, are permitted provided that the following conditions are met:
  6.  * 
  7.  * -Redistributions of source code must retain the above copyright notice, this 
  8.  * list of conditions and the following disclaimer.
  9.  *
  10.  * -Redistribution in binary form must reproduct the above copyright notice,
  11.  * this list of conditions and the following disclaimer in the documentation
  12.  * and/or other materials provided with the distribution.
  13.  * 
  14.  * Neither the name of Sun Microsystems, Inc. or the names of contributors may
  15.  * be used to endorse or promote products derived from this software without
  16.  * specific prior written permission.
  17.  * 
  18.  * This software is provided "AS IS," without a warranty of any kind. ALL
  19.  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
  20.  * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
  21.  * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN AND ITS LICENSORS SHALL NOT BE
  22.  * LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
  23.  * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL SUN OR ITS
  24.  * LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
  25.  * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
  26.  * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
  27.  * OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
  28.  * POSSIBILITY OF SUCH DAMAGES.
  29.  * 
  30.  * You acknowledge that Software is not designed,licensed or intended for use in 
  31.  * the design, construction, operation or maintenance of any nuclear facility.
  32.  */
  33. import java.awt.image.RenderedImage;
  34. import java.util.Collections;
  35. import java.util.Iterator;
  36. import java.util.zip.Deflater;
  37. /**
  38.  * An instance of <code>ImageEncodeParam</code> for encoding images in 
  39.  * the TIFF format.
  40.  *
  41.  * <p> This class allows for the specification of encoding parameters. By
  42.  * default, the image is encoded without any compression, and is written
  43.  * out consisting of strips, not tiles. The particular compression scheme 
  44.  * to be used can be specified by using the <code>setCompression()</code>
  45.  * method. The compression scheme specified will be honored only if it is 
  46.  * compatible with the type of image being written out. For example, 
  47.  * Group3 and Group4 compressions can only be used with Bilevel images.
  48.  * Writing of tiled TIFF images can be enabled by calling the
  49.  * <code>setWriteTiled()</code> method.
  50.  *
  51.  * <p><b> This class is not a committed part of the JAI API.  It may
  52.  * be removed or changed in future releases of JAI.</b>
  53.  *
  54.  */
  55. public class TIFFEncodeParam implements ImageEncodeParam {
  56.     /** No compression. */
  57.     public static final int COMPRESSION_NONE          = 1;
  58.     /** Byte-oriented run-length encoding "PackBits" compression. */
  59.     public static final int COMPRESSION_PACKBITS      = 2;
  60.     /**
  61.      * Modified Huffman Compression (CCITT Group 3 1D facsimile compression).
  62.      * <p><b>Not currently supported.</b>
  63.      */
  64.     public static final int COMPRESSION_GROUP3_1D     = 3;
  65.     /**
  66.      * CCITT T.4 bilevel compression (CCITT Group 3 2D facsimile compression).
  67.      * <p><b>Not currently supported.</b>
  68.      */
  69.     public static final int COMPRESSION_GROUP3_2D     = 4;
  70.     /**
  71.      * CCITT T.6 bilevel compression (CCITT Group 4 facsimile compression).
  72.      * <p><b>Not currently supported.</b>
  73.      */
  74.     public static final int COMPRESSION_GROUP4        = 5;
  75.     /**
  76.      * LZW compression.
  77.      * <p><b>Not supported.</b>
  78.      */
  79.     public static final int COMPRESSION_LZW           = 6;
  80.     /**
  81.      * <a href="ftp://ftp.sgi.com/graphics/tiff/TTN2.draft.txt"> 
  82.      * JPEG-in-TIFF</a> compression.
  83.      */
  84.     public static final int COMPRESSION_JPEG_TTN2     = 7;
  85.     /**
  86.      * <a href="http://info.internet.isi.edu:80/in-notes/rfc/files/rfc1951.txt"> 
  87.      * DEFLATE</a> lossless compression (also known as "Zip-in-TIFF").
  88.      */
  89.     public static final int COMPRESSION_DEFLATE       = 32946;
  90.     private int compression = COMPRESSION_NONE;
  91.     private boolean writeTiled = false;
  92.     private int tileWidth;
  93.     private int tileHeight;
  94.     private Iterator extraImages;
  95.     private TIFFField[] extraFields;
  96.     private boolean convertJPEGRGBToYCbCr = true;
  97.     private JPEGEncodeParam jpegEncodeParam = null;
  98.     private int deflateLevel = Deflater.DEFAULT_COMPRESSION;
  99.     /** 
  100.      * Constructs a TIFFEncodeParam object with default values for
  101.      * all parameters.
  102.      */
  103.     public TIFFEncodeParam() {}
  104.     /**
  105.      * Returns the value of the compression parameter.
  106.      */
  107.     public int getCompression() {
  108. return compression;
  109.     }
  110.     /**
  111.      * Specifies the type of compression to be used.  The compression type
  112.      * specified will be honored only if it is compatible with the image
  113.      * being written out.  Currently only PackBits, JPEG, and DEFLATE
  114.      * compression schemes are supported.
  115.      *
  116.      * <p> If <code>compression</code> is set to any value but
  117.      * <code>COMPRESSION_NONE</code> and the <code>OutputStream</code>
  118.      * supplied to the <code>ImageEncoder</code> is not a
  119.      * <code>SeekableOutputStream</code>, then the encoder will use either
  120.      * a temporary file or a memory cache when compressing the data
  121.      * depending on whether the file system is accessible.  Compression
  122.      * will therefore be more efficient if a <code>SeekableOutputStream</code>
  123.      * is supplied.
  124.      *
  125.      * @param compression    The compression type.
  126.      */
  127.     public void setCompression(int compression) {
  128.         switch(compression) {
  129.         case COMPRESSION_NONE:
  130.         case COMPRESSION_PACKBITS:
  131.         case COMPRESSION_JPEG_TTN2:
  132.         case COMPRESSION_DEFLATE:
  133.             // Do nothing.
  134.             break;
  135.         default:
  136.     throw new Error(JaiI18N.getString("TIFFEncodeParam0"));
  137. }
  138. this.compression = compression;
  139.     }
  140.     /**
  141.      * Returns the value of the writeTiled parameter. 
  142.      */
  143.     public boolean getWriteTiled() {
  144. return writeTiled;
  145.     }
  146.     /**
  147.      * If set, the data will be written out in tiled format, instead of
  148.      * in strips.
  149.      *
  150.      * @param writeTiled     Specifies whether the image data should be 
  151.      *                       wriiten out in tiled format.
  152.      */
  153.     public void setWriteTiled(boolean writeTiled) {
  154. this.writeTiled = writeTiled;
  155.     }
  156.     /**
  157.      * Sets the dimensions of the tiles to be written.  If either
  158.      * value is non-positive, the encoder will use a default value.
  159.      *
  160.      * <p> If the data are being written as tiles, i.e.,
  161.      * <code>getWriteTiled()</code> returns <code>true</code>, then the
  162.      * default tile dimensions used by the encoder are those of the tiles
  163.      * of the image being encoded.
  164.      *
  165.      * <p> If the data are being written as strips, i.e.,
  166.      * <code>getWriteTiled()</code> returns <code>false</code>, the width
  167.      * of each strip is always the width of the image and the default
  168.      * number of rows per strip is 8.
  169.      *
  170.      * <p> If JPEG compession is being used, the dimensions of the strips or
  171.      * tiles may be modified to conform to the JPEG-in-TIFF specification.
  172.      * 
  173.      * @param tileWidth The tile width; ignored if strips are used.
  174.      * @param tileHeight The tile height or number of rows per strip.
  175.      */
  176.     public void setTileSize(int tileWidth, int tileHeight) {
  177.         this.tileWidth = tileWidth;
  178.         this.tileHeight = tileHeight;
  179.     }
  180.     /**
  181.      * Retrieves the tile width set via <code>setTileSize()</code>.
  182.      */
  183.     public int getTileWidth() {
  184.         return tileWidth;
  185.     }
  186.     /**
  187.      * Retrieves the tile height set via <code>setTileSize()</code>.
  188.      */
  189.     public int getTileHeight() {
  190.         return tileHeight;
  191.     }
  192.     /**
  193.      * Sets an <code>Iterator</code> of additional images to be written
  194.      * after the image passed as an argument to the <code>ImageEncoder</code>.
  195.      * The methods on the supplied <code>Iterator</code> must only be invoked
  196.      * by the <code>ImageEncoder</code> which will exhaust the available
  197.      * values unless an error occurs.
  198.      *
  199.      * <p> The value returned by an invocation of <code>next()</code> on the
  200.      * <code>Iterator</code> must return either a <code>RenderedImage</code>
  201.      * or an <code>Object[]</code> of length 2 wherein the element at index
  202.      * zero is a <code>RenderedImage</code> amd the other element is a
  203.      * <code>TIFFEncodeParam</code>.  If no <code>TIFFEncodeParam</code> is
  204.      * supplied in this manner for an additional image, the parameters used
  205.      * to create the <code>ImageEncoder</code> will be used.  The extra
  206.      * image <code>Iterator</code> set on any <code>TIFFEncodeParam</code>
  207.      * of an additional image will in all cases be ignored.
  208.      */
  209.     public synchronized void setExtraImages(Iterator extraImages) {
  210.         this.extraImages = extraImages;
  211.     }
  212.     /**
  213.      * Returns the additional image <code>Iterator</code> specified via
  214.      * <code>setExtraImages()</code> or <code>null</code> if none was
  215.      * supplied or if a <code>null</code> value was supplied.
  216.      */
  217.     public synchronized Iterator getExtraImages() {
  218.         return extraImages;
  219.     }
  220.     /**
  221.      * Sets the compression level for DEFLATE-compressed data which should
  222.      * either be <code>java.util.Deflater.DEFAULT_COMPRESSION</code> or a
  223.      * value in the range [1,9] where larger values indicate more compression.
  224.      * The default setting is <code>Deflater.DEFAULT_COMPRESSION</code>.  This
  225.      * setting is ignored if the compression type is not DEFLATE.
  226.      */
  227.     public void setDeflateLevel(int deflateLevel) {
  228.         if(deflateLevel < 1 && deflateLevel > 9 &&
  229.            deflateLevel != Deflater.DEFAULT_COMPRESSION) {
  230.     throw new Error(JaiI18N.getString("TIFFEncodeParam1"));
  231.         }
  232.         this.deflateLevel = deflateLevel;
  233.     }
  234.     /**
  235.      * Gets the compression level for DEFLATE compression.
  236.      */
  237.     public int getDeflateLevel() {
  238.         return deflateLevel;
  239.     }
  240.     /**
  241.      * Sets flag indicating whether to convert RGB data to YCbCr when the
  242.      * compression type is JPEG.  The default value is <code>true</code>.
  243.      * This flag is ignored if the compression type is not JPEG.
  244.      */
  245.     public void setJPEGCompressRGBToYCbCr(boolean convertJPEGRGBToYCbCr) {
  246.         this.convertJPEGRGBToYCbCr = convertJPEGRGBToYCbCr;
  247.     }
  248.     /**
  249.      * Whether RGB data will be converted to YCbCr when using JPEG compression.
  250.      */
  251.     public boolean getJPEGCompressRGBToYCbCr() {
  252.         return convertJPEGRGBToYCbCr;
  253.     }
  254.     /**
  255.      * Sets the JPEG compression parameters.  These parameters are ignored
  256.      * if the compression type is not JPEG.  The argument may be
  257.      * <code>null</code> to indicate that default compression parameters
  258.      * are to be used.  For maximum conformance with the specification it
  259.      * is recommended in most cases that only the quality compression
  260.      * parameter be set.
  261.      *
  262.      * <p> The <code>writeTablesOnly</code> and <code>JFIFHeader</code>
  263.      * flags of the <code>JPEGEncodeParam</code> are ignored.  The
  264.      * <code>writeImageOnly</code> flag is used to determine whether the
  265.      * JPEGTables field will be written to the TIFF stream: if
  266.      * <code>writeImageOnly</code> is <code>true</code>, then the JPEGTables
  267.      * field will be written and will contain a valid JPEG abbreviated
  268.      * table specification datastream.  In this case the data in each data
  269.      * segment (strip or tile) will contain an abbreviated JPEG image
  270.      * datastream.  If the <code>writeImageOnly</code> flag is
  271.      * <code>false</code>, then the JPEGTables field will not be written and
  272.      * each data segment will contain a complete JPEG interchange datastream.
  273.      */
  274.     public void setJPEGEncodeParam(JPEGEncodeParam jpegEncodeParam) {
  275.         if(jpegEncodeParam != null) {
  276.             jpegEncodeParam = (JPEGEncodeParam)jpegEncodeParam.clone();
  277.             jpegEncodeParam.setWriteTablesOnly(false);
  278.             jpegEncodeParam.setWriteJFIFHeader(false);
  279.         }
  280.         this.jpegEncodeParam = jpegEncodeParam;
  281.     }
  282.     /**
  283.      * Retrieves the JPEG compression parameters.
  284.      */
  285.     public JPEGEncodeParam getJPEGEncodeParam() {
  286.         if(jpegEncodeParam == null) {
  287.             jpegEncodeParam = new JPEGEncodeParam();
  288.             jpegEncodeParam.setWriteTablesOnly(false);
  289.             jpegEncodeParam.setWriteImageOnly(true);
  290.             jpegEncodeParam.setWriteJFIFHeader(false);
  291.         }
  292.         return jpegEncodeParam;
  293.     }
  294.     /**
  295.      * Sets an array of extra fields to be written to the TIFF Image File
  296.      * Directory (IFD).  Fields with tags equal to the tag of any
  297.      * automatically generated fields are ignored.  No error checking is
  298.      * performed with respect to the validity of the field contents or
  299.      * the appropriateness of the field for the image being encoded.
  300.      *
  301.      * @param extraFields An array of extra fields; the parameter is
  302.      * copied by reference.
  303.      */
  304.     public void setExtraFields(TIFFField[] extraFields) {
  305.         this.extraFields = extraFields;
  306.     }
  307.     /**
  308.      * Returns the value set by <code>setExtraFields()</code>.
  309.      */
  310.     public TIFFField[] getExtraFields() {
  311.         return extraFields;
  312.     }
  313. }