PNGDecodeParam.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. /**
  34.  * An instance of <code>ImageDecodeParam</code> for decoding images in
  35.  * the PNG format.
  36.  *
  37.  * <code>PNGDecodeParam</code> allows several aspects of the decoding
  38.  * process for PNG images to be controlled.  By default, decoding produces
  39.  * output images with the following properties:
  40.  *
  41.  * <p> Images with a bit depth of 8 or less use a
  42.  * <code>DataBufferByte</code> to hold the pixel data.  16-bit images
  43.  * use a <code>DataBufferUShort</code>.
  44.  *
  45.  * <p> Palette color images and non-transparent grayscale images with
  46.  * bit depths of 1, 2, or 4 will have a
  47.  * <code>MultiPixelPackedSampleModel</code> and an
  48.  * <code>IndexColorModel</code>.  For palette color images, the
  49.  * <code>ColorModel</code> palette contains the red, green, blue, and
  50.  * optionally alpha palette information.  For grayscale images, the
  51.  * palette is used to expand the pixel data to cover the range 0-255.
  52.  * The pixels are stored packed 8, 4, or 2 to the byte.
  53.  *
  54.  * <p> All other images are stored using a
  55.  * <code>PixelInterleavedSampleModel</code> with each sample of a pixel
  56.  * occupying its own <code>byte</code> or <code>short</code> within
  57.  * the <code>DataBuffer</code>.  A <code>ComponentColorModel</code> is
  58.  * used which simply extracts the red, green, blue, gray, and/or alpha
  59.  * information from separate <code>DataBuffer</code> entries.
  60.  *
  61.  * <p> Five aspects of this process may be altered by means of methods
  62.  * in this class.
  63.  *
  64.  * <p> <code>setSuppressAlpha()</code> prevents an alpha channel
  65.  * from appearing in the output.
  66.  *
  67.  * <p> <code>setExpandPalette()</code> turns palette-color images into
  68.  * 3-or 4-channel full-color images.
  69.  *
  70.  * <p> <code>setOutput8BitGray()</code> causes 1, 2, or 4 bit
  71.  * grayscale images to be output in 8-bit form, using a
  72.  * <code>ComponentSampleModel</code> and
  73.  * <code>ComponentColorModel</code>.
  74.  *
  75.  * <p> <code>setDecodingExponent()</code> causes the output image to be
  76.  * gamma-corrected using a supplied output gamma value.
  77.  *
  78.  * <p> <code>setExpandGrayAlpha()</code> causes 2-channel gray/alpha
  79.  * (GA) images to be output as full-color (GGGA) images, which may
  80.  * simplify further processing and display.
  81.  *
  82.  * <p><b> This class is not a committed part of the JAI API.  It may
  83.  * be removed or changed in future releases of JAI.</b>
  84.  */
  85. public class PNGDecodeParam implements ImageDecodeParam {
  86.     /**
  87.      * Constructs a default instance of <code>PNGDecodeParam</code>.
  88.      */
  89.     public PNGDecodeParam() {}
  90.     private boolean suppressAlpha = false;
  91.     /**
  92.      * Returns <code>true</code> if alpha (transparency) will
  93.      * be prevented from appearing in the output.
  94.      */
  95.     public boolean getSuppressAlpha() {
  96.         return suppressAlpha;
  97.     }
  98.     /**
  99.      * If set, no alpha (transparency) channel will appear in the
  100.      * output image.
  101.      *
  102.      * <p> The default is to allow transparency to appear in the
  103.      * output image.
  104.      */
  105.     public void setSuppressAlpha(boolean suppressAlpha) {
  106.         this.suppressAlpha = suppressAlpha;
  107.     }
  108.     private boolean expandPalette = false;
  109.     /**
  110.      * Returns true if palette-color images will be expanded to
  111.      * produce full-color output.
  112.      */
  113.     public boolean getExpandPalette() {
  114.         return expandPalette;
  115.     }
  116.     /**
  117.      * If set, palette color images (PNG color type 3) will
  118.      * be decoded into full-color (RGB) output images.  The output
  119.      * image may have 3 or 4 channels, depending on the presence of
  120.      * transparency information.
  121.      *
  122.      * <p> The default is to output palette images using a single
  123.      * channel.  The palette information is used to construct the
  124.      * output image's <code>ColorModel</code>.
  125.      */
  126.     public void setExpandPalette(boolean expandPalette) {
  127.         this.expandPalette = expandPalette;
  128.     }
  129.     private boolean output8BitGray = false;
  130.     /**
  131.      * Returns the current value of the 8-bit gray output parameter.
  132.      */
  133.     public boolean getOutput8BitGray() {
  134.         return output8BitGray;
  135.     }
  136.     /**
  137.      * If set, grayscale images with a bit depth less than 8
  138.      * (1, 2, or 4) will be output in 8 bit form.  The output values
  139.      * will occupy the full 8-bit range.  For example, gray values
  140.      * 0, 1, 2, and 3 of a 2-bit image will be output as
  141.      * 0, 85, 170, and 255.
  142.      *
  143.      * <p> The decoding of non-grayscale images and grayscale images
  144.      * with a bit depth of 8 or 16 are unaffected by this setting.
  145.      *
  146.      * <p> The default is not to perform expansion.  Grayscale images
  147.      * with a depth of 1, 2, or 4 bits will be represented using
  148.      * a <code>MultiPixelPackedSampleModel</code> and an
  149.      * <code>IndexColorModel</code>.
  150.      */
  151.     public void setOutput8BitGray(boolean output8BitGray) {
  152.         this.output8BitGray = output8BitGray;
  153.     }
  154.     private boolean performGammaCorrection = true;
  155.     /**
  156.      * Returns <code>true</code> if gamma correction is to be performed
  157.      * on the image data.  The default is <code>true</code>.
  158.      *
  159.      * <p> If gamma correction is to be performed, the
  160.      * <code>getUserExponent()</code> and
  161.      * <code>getDisplayExponent()</code> methods are used in addition to
  162.      * the gamma value stored within the file (or the default value of
  163.      * 1/2.2 used if no value is found) to produce a single exponent
  164.      * using the formula:
  165.      * <pre>
  166.      * decoding_exponent = user_exponent/(gamma_from_file * display_exponent)
  167.      * </pre>
  168.      */
  169.     public boolean getPerformGammaCorrection() {
  170.         return performGammaCorrection;
  171.     }
  172.     /**
  173.      * Turns gamma corection of the image data on or off.
  174.      */
  175.     public void setPerformGammaCorrection(boolean performGammaCorrection) {
  176.         this.performGammaCorrection = performGammaCorrection;
  177.     }
  178.     private float userExponent = 1.0F;
  179.     /**
  180.      * Returns the current value of the user exponent parameter.
  181.      * By default, the user exponent is equal to 1.0F.
  182.      */
  183.     public float getUserExponent() {
  184.         return userExponent;
  185.     }
  186.     /**
  187.      * Sets the user exponent to a given value.  The exponent
  188.      * must be positive.  If not, an
  189.      * <code>IllegalArgumentException</code> will be thrown.
  190.      *
  191.      * <p> The output image pixels will be placed through a transformation
  192.      * of the form:
  193.      *
  194.      * <pre>
  195.      * sample = integer_sample / (2^bitdepth - 1.0)
  196.      * decoding_exponent = user_exponent/(gamma_from_file * display_exponent)
  197.      * output = sample ^ decoding_exponent
  198.      * </pre>
  199.      *
  200.      * where <code>gamma_from_file</code> is the gamma of the file
  201.      * data, as determined by the <code>gAMA</code>, </code>sRGB</code>,
  202.      * and/or <code>iCCP</code> chunks, and <code>display_exponent</code>
  203.      * is the exponent of the intrinsic transfer curve of the display,
  204.      * generally 2.2.
  205.      *
  206.      * <p> Input files which do not specify any gamma are assumed to
  207.      * have a gamma of <code>1/2.2</code>; such images may be displayed
  208.      * on a CRT with an exponent of 2.2 using the default user
  209.      * exponent of 1.0.
  210.      *
  211.      * <p> The user exponent may be used in order to change the
  212.      * effective gamma of a file.  If a file has a stored gamma of
  213.      * X, but the decoder believes that the true file gamma is Y,
  214.      * setting a user exponent of Y/X will produce the same result
  215.      * as changing the file gamma.
  216.      *
  217.      * <p> This parameter affects the decoding of all image types.
  218.      *
  219.      * @throws IllegalArgumentException if <code>userExponent</code> is 
  220.      * negative.
  221.      */
  222.     public void setUserExponent(float userExponent) {
  223.         if (userExponent <= 0.0F) {
  224.             throw new IllegalArgumentException(JaiI18N.getString("PNGDecodeParam0"));
  225.         }
  226.         this.userExponent = userExponent;
  227.     }
  228.     private float displayExponent = 2.2F;
  229.     /**
  230.      * Returns the current value of the display exponent parameter.
  231.      * By default, the display exponent is equal to 2.2F.
  232.      */
  233.     public float getDisplayExponent() {
  234.         return displayExponent;
  235.     }
  236.     /**
  237.      * Sets the display exponent to a given value.  The exponent
  238.      * must be positive.  If not, an
  239.      * <code>IllegalArgumentException</code> will be thrown.
  240.      *
  241.      * <p> The output image pixels will be placed through a transformation
  242.      * of the form:
  243.      *
  244.      * <pre>
  245.      * sample = integer_sample / (2^bitdepth - 1.0)
  246.      * decoding_exponent = user_exponent/(gamma_from_file * display_exponent)
  247.      * output = sample ^ decoding_exponent
  248.      * </pre>
  249.      *
  250.      * where <code>gamma_from_file</code> is the gamma of the file
  251.      * data, as determined by the <code>gAMA</code>, </code>sRGB</code>,
  252.      * and/or <code>iCCP</code> chunks, and <code>user_exponent</code>
  253.      * is an additional user-supplied parameter.
  254.      *
  255.      * <p> Input files which do not specify any gamma are assumed to
  256.      * have a gamma of <code>1/2.2</code>; such images should be
  257.      * decoding using the default display exponent of 2.2.
  258.      *
  259.      * <p> If an image is to be processed further before being displayed,
  260.      * it may be preferable to set the display exponent to 1.0 in order
  261.      * to produce a linear output image.
  262.      *
  263.      * <p> This parameter affects the decoding of all image types.
  264.      *
  265.      * @throws IllegalArgumentException if <code>userExponent</code> is 
  266.      * negative.
  267.      */
  268.     public void setDisplayExponent(float displayExponent) {
  269.         if (displayExponent <= 0.0F) {
  270.             throw new IllegalArgumentException(JaiI18N.getString("PNGDecodeParam1"));
  271.         }
  272.         this.displayExponent = displayExponent;
  273.     }
  274.     private boolean expandGrayAlpha = false;
  275.     /**
  276.      * Returns the current setting of the gray/alpha expansion.
  277.      */
  278.     public boolean getExpandGrayAlpha() {
  279.         return expandGrayAlpha;
  280.     }
  281.     /**
  282.      * If set, images containing one channel of gray and one channel of
  283.      * alpha (GA) will be output in a 4-channel format (GGGA).  This
  284.      * produces output that may be simpler to process and display.
  285.      *
  286.      * <p> This setting affects both images of color type 4 (explicit
  287.      * alpha) and images of color type 0 (grayscale) that contain
  288.      * transparency information.
  289.      *
  290.      * <p> By default, no expansion is performed.
  291.      */
  292.     public void setExpandGrayAlpha(boolean expandGrayAlpha) {
  293.         this.expandGrayAlpha = expandGrayAlpha;
  294.     }
  295.     private boolean generateEncodeParam = false;
  296.     private PNGEncodeParam encodeParam = null;
  297.     /**
  298.      * Returns <code>true</code> if an instance of
  299.      * <code>PNGEncodeParam</code> will be available after an image
  300.      * has been decoded via the <code>getEncodeParam</code> method.
  301.      */
  302.     public boolean getGenerateEncodeParam() {
  303.         return generateEncodeParam;
  304.     }
  305.     /**
  306.      * If set, an instance of <code>PNGEncodeParam</code> will be
  307.      * available after an image has been decoded via the
  308.      * <code>getEncodeParam</code> method that encapsulates information
  309.      * about the contents of the PNG file.  If not set, this information
  310.      * will not be recorded and <code>getEncodeParam()</code> will
  311.      * return <code>null</code>.
  312.      */
  313.     public void setGenerateEncodeParam(boolean generateEncodeParam) {
  314.         this.generateEncodeParam = generateEncodeParam;
  315.     }
  316.     /**
  317.      * If <code>getGenerateEncodeParam()</code> is <code>true</code>,
  318.      * this method may be called after decoding has completed, and
  319.      * will return an instance of <code>PNGEncodeParam</code> containing
  320.      * information about the contents of the PNG file just decoded. 
  321.      */
  322.     public PNGEncodeParam getEncodeParam() {
  323.         return encodeParam;
  324.     }
  325.     
  326.     /**
  327.      * Sets the current encoder param instance.  This method is
  328.      * intended to be called by the PNG decoder and will overwrite the
  329.      * current instance returned by <code>getEncodeParam</code>.
  330.      */
  331.     public void setEncodeParam(PNGEncodeParam encodeParam) {
  332.         this.encodeParam = encodeParam;
  333.     }
  334. }