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

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.DataBuffer;
  34. import java.awt.image.RenderedImage;
  35. import java.awt.image.SampleModel;
  36. import java.io.BufferedInputStream;
  37. import java.io.InputStream;
  38. import java.io.IOException;
  39. import java.io.OutputStream;
  40. /**
  41.  * A subclass of <code>ImageCodec</code> that handles the
  42.  * PNM family of formats (PBM, PGM, PPM).
  43.  *
  44.  * <p> The PBM format encodes a single-banded, 1-bit image.  The PGM
  45.  * format encodes a single-banded image of any bit depth between 1 and
  46.  * 32.  The PPM format encodes three-banded images of any bit depth
  47.  * between 1 and 32.  All formats have an ASCII and a raw
  48.  * representation.
  49.  *
  50.  */
  51. public final class PNMCodec extends ImageCodec {
  52.     /** Constructs an instance of <code>PNMCodec</code>. */
  53.     public PNMCodec() {}
  54.     /** Returns the name of the format handled by this codec. */
  55.     public String getFormatName() {
  56.         return "pnm";
  57.     }
  58.     public Class getEncodeParamClass() {
  59.         return PNMEncodeParam.class;
  60.     }
  61.     public Class getDecodeParamClass() {
  62.         return Object.class;
  63.     }
  64.     public boolean canEncodeImage(RenderedImage im,
  65.                                   ImageEncodeParam param) {
  66.         SampleModel sampleModel = im.getSampleModel();
  67.         int dataType = sampleModel.getTransferType();
  68.         if ((dataType == DataBuffer.TYPE_FLOAT) ||
  69.             (dataType == DataBuffer.TYPE_DOUBLE)) {
  70.             return false;
  71.         }
  72.         int numBands = sampleModel.getNumBands();
  73.         if (numBands != 1 && numBands != 3) {
  74.             return false;
  75.         }
  76.         return true;
  77.     }
  78.     /**
  79.      * Instantiates a <code>PNMImageEncoder</code> to write to the
  80.      * given <code>OutputStream</code>.
  81.      *
  82.      * @param dst the <code>OutputStream</code> to write to.
  83.      * @param param an instance of <code>PNMEncodeParam</code> used to
  84.      *        control the encoding process, or <code>null</code>.  A
  85.      *        <code>ClassCastException</code> will be thrown if
  86.      *        <code>param</code> is non-null but not an instance of
  87.      *        <code>PNMEncodeParam</code>.
  88.      */
  89.     protected ImageEncoder createImageEncoder(OutputStream dst,
  90.                                               ImageEncodeParam param) {
  91.         PNMEncodeParam p = null;
  92.         if (param != null) {
  93.             p = (PNMEncodeParam)param; // May throw a ClassCast exception
  94.         }
  95.         return new PNMImageEncoder(dst, p);
  96.     }
  97.     /**
  98.      * Instantiates a <code>PNMImageDecoder</code> to read from the
  99.      * given <code>InputStream</code>.
  100.      *
  101.      * <p> By overriding this method, <code>PNMCodec</code> is able to
  102.      * ensure that a <code>ForwardSeekableStream</code> is used to
  103.      * wrap the source <code>InputStream</code> instead of the a
  104.      * general (and more expensive) subclass of
  105.      * <code>SeekableStream</code>.  Since the PNM decoder does not
  106.      * require the ability to seek backwards in its input, this allows
  107.      * for greater efficiency.
  108.      *
  109.      * @param src the <code>InputStream</code> to read from.
  110.      * @param param an instance of <code>ImageDecodeParam</code> used to
  111.      *        control the decoding process, or <code>null</code>.
  112.      *        This parameter is ignored by this class.
  113.      */
  114.     protected ImageDecoder createImageDecoder(InputStream src,
  115.                                               ImageDecodeParam param) {
  116.         // Add buffering for efficiency
  117.         if (!(src instanceof BufferedInputStream)) {
  118.             src = new BufferedInputStream(src);
  119.         }
  120.         return new PNMImageDecoder(new ForwardSeekableStream(src), null);
  121.     }
  122.     /**
  123.      * Instantiates a <code>PNMImageDecoder</code> to read from the
  124.      * given <code>SeekableStream</code>.
  125.      *
  126.      * @param src the <code>SeekableStream</code> to read from.
  127.      * @param param an instance of <code>ImageDecodeParam</code> used to
  128.      *        control the decoding process, or <code>null</code>.
  129.      *        This parameter is ignored by this class.
  130.      */
  131.     protected ImageDecoder createImageDecoder(SeekableStream src,
  132.                                               ImageDecodeParam param) {
  133.         return new PNMImageDecoder(src, null);
  134.     }
  135.     /**
  136.      * Returns the number of bytes from the beginning of the data required
  137.      * to recognize it as being in PNM format.
  138.      */
  139.     public int getNumHeaderBytes() {
  140.          return 2;
  141.     }
  142.     /**
  143.      * Returns <code>true</code> if the header bytes indicate PNM format.
  144.      *
  145.      * @param header an array of bytes containing the initial bytes of the
  146.      *        input data.     */
  147.     public boolean isFormatRecognized(byte[] header) {
  148.         return ((header[0] == 'P') &&
  149.                 (header[1] >= '1') &&
  150.                 (header[1] <= '6'));
  151.     }
  152. }