JPEGEncodeParam.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. /**
  35.  * A class which encapsulates the most common functionality required for 
  36.  * the parameters to a Jpeg encode operation. It does not include all of
  37.  * the parameters of the <code>com.sun.image.codec.jpeg</code> classes.
  38.  * Users needing that additional functionality should use those classes
  39.  * directly, bearing in mind that they are part of an uncommitted non-core
  40.  * interface that may be modified or removed in the future.
  41.  *
  42.  * This class makes very simple assumptions about the image colorspaces.
  43.  * Images with a single band are assumed to be grayscale.
  44.  * Images with three bands are assumed to be RGB and are encoded to YCbCr.
  45.  *
  46.  * <p><b> This class is not a committed part of the JAI API.  It may
  47.  * be removed or changed in future releases of JAI.</b>
  48.  */
  49. public class JPEGEncodeParam implements ImageEncodeParam {
  50.     private static int  JPEG_MAX_BANDS = 3;
  51.     private int[]       hSamp;
  52.     private int[]       vSamp;
  53.     private int[][]     qTab;
  54.     private int[]       qTabSlot;
  55.     private float       qual;
  56.     private int         rstInterval;
  57.     private boolean     writeImageOnly;
  58.     private boolean     writeTablesOnly;
  59.     private boolean     writeJFIFHeader;
  60.     private boolean     qualitySet;
  61.     private boolean[]   qTabSet;
  62.     
  63.     /**
  64.      * Constructs a JAI JPEGEncodeParam object with default settings.
  65.      */
  66.     public JPEGEncodeParam() {
  67.         //
  68.         // Set all the defaults
  69.         //
  70.         hSamp    = new int[JPEG_MAX_BANDS];
  71.         vSamp    = new int[JPEG_MAX_BANDS];
  72.         qTabSlot = new int[JPEG_MAX_BANDS];
  73.         qTab     = new int[JPEG_MAX_BANDS][];
  74.         qTabSet  = new boolean[JPEG_MAX_BANDS];
  75.         // Y channel - full resolution sampling
  76.         hSamp[0]    = 1;
  77.         vSamp[0]    = 1;
  78.         qTabSlot[0] = 0;
  79.         qTab[0]     = null;
  80.         qTabSet[0]  = false;
  81.         // Cb channel - sample by 2 in each axis
  82.         hSamp[1]    = 2;
  83.         vSamp[1]    = 2;
  84.         qTabSlot[1] = 1;
  85.         qTab[1]     = null;
  86.         qTabSet[1]  = false;
  87.         // Cr channel - sample by 2 in each axis
  88.         hSamp[2]    = 2;
  89.         vSamp[2]    = 2;
  90.         qTabSlot[2] = 1;
  91.         qTab[2]     = null;
  92.         qTabSet[2]  = false;
  93.         qual           = 0.75F;
  94.         rstInterval    = 0;
  95.         writeImageOnly = false;
  96.         writeTablesOnly = false;
  97.         writeJFIFHeader = true;
  98.     }
  99.     /**
  100.      * Sets the horizontal subsampling to be applied to an image band.
  101.      * Defaults to 1 for grayscale and (1,2,2) for RGB.
  102.      * @param component The band for which to set horizontal subsampling.
  103.      * @param subsample The horizontal subsampling factor.
  104.      */
  105.     public void setHorizontalSubsampling(int component, 
  106.                                          int subsample) {
  107.         hSamp[component] = subsample;
  108.     }
  109.     /**
  110.      * Get the horizontal subsampling factor for a band.
  111.      * @param component The band of the image for which to retrieve subsampling.
  112.      * @return The horizontal subsampling factor to be applied to this band
  113.      */
  114.     public int getHorizontalSubsampling(int component) {
  115.         return hSamp[component];
  116.     }
  117.     
  118.     /**
  119.      * Sets the vertical subsampling to be applied to an image band.
  120.      * Defaults to 1 for grayscale and (1,2,2) for RGB.
  121.      * @param component The band for which to set vertical subsampling.
  122.      * @param subsample The vertical subsampling factor.
  123.      */
  124.     public void setVerticalSubsampling(int component, 
  125.                                        int subsample) {
  126.         vSamp[component] = subsample;
  127.     }
  128.     
  129.     /**
  130.      * Get the vertical subsampling factor for a band.
  131.      * @param component The band of the image for which to retrieve subsampling.
  132.      * @return The vertical subsampling factor to be applied to this band
  133.      */
  134.     public int getVerticalSubsampling(int component) {
  135.         return vSamp[component];
  136.     }
  137.     /** 
  138.      * Sets the quantization table to be used for luminance data.
  139.      * This is a convenience method which explicitly sets the
  140.      * contents of quantization table 0. The length of the table must be 64.
  141.      * This disables any quality setting.
  142.      * @param qTable Quantization table values in "zig-zag" order.
  143.      */
  144.     public void setLumaQTable(int[] qTable) {
  145.         setQTable(0, 0, qTable);
  146.         qTabSet[0] = true;
  147.         qualitySet = false;
  148.     }
  149.     
  150.     /** 
  151.      * Sets the quantization table to be used for chrominance data.
  152.      * This is a convenience method which explicitly sets the
  153.      * contents of quantization table 1. The length of the table must be 64.
  154.      * This method assumes that all chroma components will use the same table.
  155.      * This disables any quality setting.
  156.      * @param qTable Quantization table values in "zig-zag" order.
  157.      */
  158.     public void setChromaQTable(int[] qTable) {
  159.         setQTable(1, 1, qTable);
  160.         setQTable(2, 1, qTable);
  161.         qTabSet[1] = true;
  162.         qTabSet[2] = true;
  163.         qualitySet = false;
  164.     }
  165.     
  166.     /**
  167.      * Sets a quantization table to be used for a component.
  168.      * This method allows up to four independent tables to be specified.
  169.      * This disables any quality setting.
  170.      * @param component The band to which this table applies.
  171.      * @param tableSlot The table number that this table is assigned to (0 to 3).
  172.      * @param qTable Quantization table values in "zig-zag" order.
  173.      */
  174.     public void setQTable(int component, int tableSlot, int[]qTable) {
  175.         qTab[component] = (int[])(qTable.clone());
  176.         qTabSlot[component] = tableSlot;
  177.         qTabSet[component] = true;
  178.         qualitySet = false;
  179.     }
  180.     /**
  181.      * Tests if a Quantization table has been set.
  182.      * @return Returns true is the specified quantization table has been set.
  183.      */
  184.     public boolean isQTableSet(int component) {
  185.         return qTabSet[component];
  186.     }
  187.     /**
  188.      * Retrieve the contents of the quantization table used for a component.
  189.      * @param component The band to which this table applies.
  190.      * @return The contents of the quantization table as a reference.
  191.      * @throws IllegalStateException if table has not been previously set for this component.
  192.      */
  193.     public int[] getQTable(int component) {
  194.         if (!qTabSet[component]) {
  195.             throw new IllegalStateException(
  196.                JaiI18N.getString("JPEGEncodeParam0"));
  197.         }
  198.         return qTab[component];
  199.     }
  200.     /**
  201.      * Retrieve the quantization table slot used for a component.
  202.      * @param component The band to which this table slot applies.
  203.      * @return The table slot used for this band.
  204.      * @throws IllegalStateException if table has not been previously set for this component.
  205.      */
  206.     public int getQTableSlot(int component) {
  207.         if (!qTabSet[component]) {
  208.             throw new IllegalStateException(
  209.                JaiI18N.getString("JPEGEncodeParam0"));
  210.         }
  211.         return qTabSlot[component];
  212.     }
  213.     /**
  214.      * Sets the restart interval in Minimum Coded Units (MCUs).
  215.      * This can be useful in some environments to limit the effect
  216.      * of bitstream errors to a single restart interval.
  217.      * The default is zero (no restart interval markers).
  218.      * @param restartInterval Number of MCUs between restart markers.
  219.      */
  220.     public void setRestartInterval(int restartInterval) {
  221.         rstInterval = restartInterval;
  222.     }
  223.     /**
  224.      * Gets the restart interval in Minimum Coded Units (MCUs).
  225.      * @return The restart interval in MCUs (0 if not set).
  226.      */
  227.     public int getRestartInterval() {
  228.         return rstInterval;
  229.     }
  230.     
  231.     /**
  232.      * This creates new quantization tables that replace the currently
  233.      * installed quantization tables.  
  234.      * The created quantization table varies from very high
  235.      * compression, very low quality, (0.0) to low compression, very
  236.      * high quality (1.0) based on the quality parameter.<P>
  237.      * At a quality level of 1.0 the table will be all 1's which will
  238.      * lead to no loss of data due to quantization (however chrominace
  239.      * subsampling, if used, and roundoff error in the DCT will still
  240.      * degrade the image some what).<P>
  241.      * The default setting is 0.75 which provides high quality while
  242.      * insuring a good compression ratio.
  243.      * <pre>Some guidelines: 0.75 high quality
  244.      *                 0.5  medium quality
  245.      *                 0.25 low quality
  246.      * </pre>
  247.      * @param quality 0.0-1.0 setting of desired quality level.
  248.      */
  249.     public void setQuality(float quality) {
  250.         qual = quality;
  251.         // Reset custom Q tables
  252.         for (int i=0; i<JPEG_MAX_BANDS; i++) {
  253.             qTabSet[i] = false;
  254.         }
  255.         qualitySet = true;
  256.     }
  257.     /**
  258.      * Tests if the quality parameter has been set in this JPEGEncodeParam.
  259.      * @return True/false flag indicating if quality has been set.
  260.      */
  261.     public boolean isQualitySet() {
  262.         return qualitySet;
  263.     }
  264.     /** 
  265.      * Retrieve the quality setting for this encoding.
  266.      * This is a number between 0.0 and 1.0.
  267.      *
  268.      * @return The specified quality setting (0.75 if not set).
  269.      */
  270.     public float getQuality() {
  271.         return qual;
  272.     }
  273.     /**
  274.      * Instructs the encoder to write only the table data to the output stream.
  275.      * This is considered an abbreviated JPEG stream. Defaults to false -- normally
  276.      * both tables and encoded image data are written.
  277.      * @param tablesOnly If true, only the tables will be written.
  278.      */
  279.     public void setWriteTablesOnly(boolean tablesOnly) {
  280.         writeTablesOnly = tablesOnly;
  281.     }
  282.     /**
  283.      * Retrieve the setting of the writeTablesOnly flag.
  284.      * @return The setting of the writeTablesOnly flag (false if not set).
  285.      */
  286.     public boolean getWriteTablesOnly() {
  287.         return writeTablesOnly;
  288.     }
  289.     /**
  290.      * Controls whether the encoder writes only the compressed image data 
  291.      * to the output stream.
  292.      * This is considered an abbreviated JPEG stream. Defaults to false -- normally
  293.      * both tables and compressed image data are written.
  294.      * @param imageOnly If true, only the compressed image will be written.
  295.      */
  296.     public void setWriteImageOnly(boolean imageOnly) {
  297.         writeImageOnly = imageOnly;
  298.     }
  299.     /**
  300.      * Retrieve the setting of the writeImageOnly flag.
  301.      * @return The setting of the writeImageOnly flag (false if not set).
  302.      */
  303.     public boolean getWriteImageOnly() {
  304.         return writeImageOnly;
  305.     }
  306.     /**
  307.      * Controls whether the encoder writes a JFIF header using the APP0 marker.
  308.      * By default an APP0 marker is written to create a JFIF file.
  309.      * @param writeJFIF If true, writes a JFIF header.
  310.      */
  311.     public void setWriteJFIFHeader(boolean writeJFIF) {
  312.         writeJFIFHeader = writeJFIF;
  313.     }
  314.     /**
  315.      * Retrieve the setting of the writeJFIF flag.
  316.      * @return The setting of the writeJFIF flag (true if not set).
  317.      */
  318.     public boolean getWriteJFIFHeader() {
  319.         return writeJFIFHeader;
  320.     }
  321.     /**
  322.      * Returns a copy of this <code>JPEGEncodeParam</code> object.
  323.      */
  324.     public Object clone() {
  325.         try {
  326.             return super.clone();
  327.         } catch (CloneNotSupportedException e) {
  328.             // this shouldn't happen, since we are Cloneable
  329.             throw new InternalError();
  330.         }
  331.     }
  332. }