将Java image对象转换成PNG格式字节数组 |
| 作者:不详 来源:本站整理 发布时间:2005-11-29 13:01:15 |
|
/** * 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. * * Thanks to Jay Denny at KeyPoint Software * http://www.keypoint.com/ * who let me develop this code on company time. * * You may contact me with (probably very-much-needed) improvements, * comments, and bug fixes at: * * david@catcode.com * * 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. * * 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. * * 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 * http://www.gnu.org/copyleft/lesser.html, * * @author J. David Eisenberg * @version 1.4, 31 March 2000 */ import java.awt.*; import java.awt.image.*; import java.util.*; import java.util.zip.*; import java.io.*; 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 filters */ public static final int FILTER_NONE = 0; public static final int FILTER_SUB = 1; public static final int FILTER_UP = 2; public static final int FILTER_LAST = 2; protected byte[] pngBytes; protected byte[] priorRow; protected byte[] leftBytes; protected Image image; protected int width, height; protected int bytePos, maxPos; protected int hdrPos, dataPos, endPos; protected CRC32 crc = new CRC32(); protected long crcValue; protected boolean encodeAlpha; protected int filter; protected int bytesPerPixel; 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 }; int i; if (image == null) { return null; } width = image.getWidth( null ); height = image.getHeight( null ); this.image = image; /* * 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; } re |
| [] [返回上一页] [打 印] |
|
文章评论 |
