⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pngencoder.java

📁 PngEncoder - convert a Java Image to PNG PngEncoderB - convert a Java BufferedImage to PNG
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package com.keypoint;import java.awt.Image;import java.awt.image.ImageObserver;import java.awt.image.PixelGrabber;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.util.zip.CRC32;import java.util.zip.Deflater;import java.util.zip.DeflaterOutputStream;/** * PngEncoder takes a Java Image object and creates a byte string which can be saved as a PNG file. * The Image is presumed to use the DirectColorModel. * * <p>Thanks to Jay Denny at KeyPoint Software *    http://www.keypoint.com/ * who let me develop this code on company time.</p> * * <p>You may contact me with (probably very-much-needed) improvements, * comments, and bug fixes at:</p> * *   <p><code>david@catcode.com</code></p> * * <p>This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version.</p> * * <p>This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Lesser General Public License for more details.</p> * * <p>You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA * A copy of the GNU LGPL may be found at * <code>http://www.gnu.org/copyleft/lesser.html</code></p> * * @author J. David Eisenberg * @version 1.5, 19 Oct 2003 * * CHANGES: * -------- * 19-Nov-2002 : CODING STYLE CHANGES ONLY (by David Gilbert for Object Refinery Limited); * 19-Sep-2003 : Fix for platforms using EBCDIC (contributed by Paulo Soares); * 19-Oct-2003 : Change private fields to protected fields so that *               PngEncoderB can inherit them (JDE) *				 Fixed bug with calculation of nRows */public class PngEncoder extends Object {    /** Constant specifying that alpha channel should be encoded. */    public static final boolean ENCODE_ALPHA = true;    /** Constant specifying that alpha channel should not be encoded. */    public static final boolean NO_ALPHA = false;    /** Constants for filter (NONE) */    public static final int FILTER_NONE = 0;    /** Constants for filter (SUB) */    public static final int FILTER_SUB = 1;    /** Constants for filter (UP) */    public static final int FILTER_UP = 2;    /** Constants for filter (LAST) */    public static final int FILTER_LAST = 2;        /** IHDR tag. */    protected static final byte IHDR[] = {73, 72, 68, 82};        /** IDAT tag. */    protected static final byte IDAT[] = {73, 68, 65, 84};        /** IEND tag. */    protected static final byte IEND[] = {73, 69, 78, 68};    /** The png bytes. */    protected byte[] pngBytes;    /** The prior row. */    protected byte[] priorRow;    /** The left bytes. */    protected byte[] leftBytes;    /** The image. */    protected Image image;    /** The width. */    protected int width, height;    /** The byte position. */    protected int bytePos, maxPos;    /** CRC. */    protected CRC32 crc = new CRC32();    /** The CRC value. */    protected long crcValue;    /** Encode alpha? */    protected boolean encodeAlpha;    /** The filter type. */    protected int filter;    /** The bytes-per-pixel. */    protected int bytesPerPixel;    /** The compression level. */    protected int compressionLevel;    /**     * Class constructor     */    public PngEncoder() {        this(null, false, FILTER_NONE, 0);    }    /**     * Class constructor specifying Image to encode, with no alpha channel encoding.     *     * @param image A Java Image object which uses the DirectColorModel     * @see java.awt.Image     */    public PngEncoder(Image image) {        this(image, false, FILTER_NONE, 0);    }    /**     * Class constructor specifying Image to encode, and whether to encode alpha.     *     * @param image A Java Image object which uses the DirectColorModel     * @param encodeAlpha Encode the alpha channel? false=no; true=yes     * @see java.awt.Image     */    public PngEncoder(Image image, boolean encodeAlpha) {        this(image, encodeAlpha, FILTER_NONE, 0);    }    /**     * Class constructor specifying Image to encode, whether to encode alpha, and filter to use.     *     * @param image A Java Image object which uses the DirectColorModel     * @param encodeAlpha Encode the alpha channel? false=no; true=yes     * @param whichFilter 0=none, 1=sub, 2=up     * @see java.awt.Image     */    public PngEncoder(Image image, boolean encodeAlpha, int whichFilter) {        this(image, encodeAlpha, whichFilter, 0);    }    /**     * Class constructor specifying Image source to encode, whether to encode alpha, filter to use,     * and compression level.     *     * @param image A Java Image object     * @param encodeAlpha Encode the alpha channel? false=no; true=yes     * @param whichFilter 0=none, 1=sub, 2=up     * @param compLevel 0..9     * @see java.awt.Image     */    public PngEncoder(Image image, boolean encodeAlpha, int whichFilter, int compLevel) {        this.image = image;        this.encodeAlpha = encodeAlpha;        setFilter(whichFilter);        if (compLevel >= 0 && compLevel <= 9) {            this.compressionLevel = compLevel;        }    }    /**     * Set the image to be encoded     *     * @param image A Java Image object which uses the DirectColorModel     * @see java.awt.Image     * @see java.awt.image.DirectColorModel     */    public void setImage(Image image) {        this.image = image;        pngBytes = null;    }    /**     * Creates an array of bytes that is the PNG equivalent of the current image, specifying     * whether to encode alpha or not.     *     * @param encodeAlpha boolean false=no alpha, true=encode alpha     * @return an array of bytes, or null if there was a problem     */    public byte[] pngEncode(boolean encodeAlpha) {        byte[]  pngIdBytes = {-119, 80, 78, 71, 13, 10, 26, 10};        if (image == null) {            return null;        }        width = image.getWidth(null);        height = image.getHeight(null);        /*         * start with an array that is big enough to hold all the pixels         * (plus filter bytes), and an extra 200 bytes for header info         */        pngBytes = new byte[((width + 1) * height * 3) + 200];        /*         * keep track of largest byte written to the array         */        maxPos = 0;        bytePos = writeBytes(pngIdBytes, 0);        //hdrPos = bytePos;        writeHeader();        //dataPos = bytePos;        if (writeImageData()) {            writeEnd();            pngBytes = resizeByteArray(pngBytes, maxPos);        }        else {            pngBytes = null;        }        return pngBytes;    }    /**     * Creates an array of bytes that is the PNG equivalent of the current image.     * Alpha encoding is determined by its setting in the constructor.     *     * @return an array of bytes, or null if there was a problem     */    public byte[] pngEncode() {        return pngEncode(encodeAlpha);    }    /**     * Set the alpha encoding on or off.     *     * @param encodeAlpha  false=no, true=yes     */    public void setEncodeAlpha(boolean encodeAlpha) {        this.encodeAlpha = encodeAlpha;    }    /**     * Retrieve alpha encoding status.     *     * @return boolean false=no, true=yes     */    public boolean getEncodeAlpha() {        return encodeAlpha;    }    /**     * Set the filter to use     *     * @param whichFilter from constant list     */    public void setFilter(int whichFilter) {        this.filter = FILTER_NONE;        if (whichFilter <= FILTER_LAST) {            this.filter = whichFilter;        }    }    /**     * Retrieve filtering scheme     *     * @return int (see constant list)     */    public int getFilter() {        return filter;    }    /**     * Set the compression level to use     *     * @param level 0 through 9     */    public void setCompressionLevel(int level) {        if (level >= 0 && level <= 9) {            this.compressionLevel = level;        }    }    /**     * Retrieve compression level     *     * @return int in range 0-9     */    public int getCompressionLevel() {        return compressionLevel;    }    /**     * Increase or decrease the length of a byte array.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -