org.jmol.export.image

Class PngEncoder

public class PngEncoder extends Object

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

Version: 1.4, 31 March 2000

Author: J. David Eisenberg http://catcode.com/pngencoder/ Christian Ribeaud (christian.ribeaud@genedata.com)

Field Summary
protected intbytePos
protected intbytesPerPixel
protected intcompressionLevel
protected CRC32crc
protected longcrcValue
protected intdataPos
protected booleanencodeAlpha
protected intendPos
static booleanENCODE_ALPHA
Constant specifying that alpha channel should be encoded.
protected intfilter
static intFILTER_LAST
static intFILTER_NONE
Constants for filters
static intFILTER_SUB
static intFILTER_UP
protected inthdrPos
protected intheight
protected Imageimage
protected byte[]leftBytes
protected intmaxPos
static booleanNO_ALPHA
Constant specifying that alpha channel should not be encoded.
protected byte[]pngBytes
protected byte[]priorRow
protected intwidth
Constructor Summary
PngEncoder()
Class constructor
PngEncoder(Image image)
Class constructor specifying Image to encode, with no alpha channel encoding.
PngEncoder(Image image, boolean encodeAlpha)
Class constructor specifying Image to encode, and whether to encode alpha.
PngEncoder(Image image, boolean encodeAlpha, int whichFilter)
Class constructor specifying Image to encode, whether to encode alpha, and filter to use.
PngEncoder(Image image, boolean encodeAlpha, int whichFilter, int compLevel)
Class constructor specifying Image source to encode, whether to encode alpha, filter to use, and compression level.
Method Summary
protected voidfilterSub(byte[] pixels, int startPos, int width)
Perform "sub" filtering on the given row.
protected voidfilterUp(byte[] pixels, int startPos, int width)
Perform "up" filtering on the given row.
intgetCompressionLevel()
Retrieve compression level
booleangetEncodeAlpha()
Retrieve alpha encoding status.
intgetFilter()
Retrieve filtering scheme
byte[]pngEncode(boolean encodeAlpha)
Creates an array of bytes that is the PNG equivalent of the current image, specifying whether to encode alpha or not.
byte[]pngEncode()
Creates an array of bytes that is the PNG equivalent of the current image.
protected byte[]resizeByteArray(byte[] array, int newLength)
Increase or decrease the length of a byte array.
voidsetCompressionLevel(int level)
Set the compression level to use
voidsetEncodeAlpha(boolean encodeAlpha)
Set the alpha encoding on or off.
voidsetFilter(int whichFilter)
Set the filter to use
voidsetImage(Image image)
Set the image to be encoded
protected intwriteByte(int b, int offset)
Write a single byte into the pngBytes array at a given position.
protected intwriteBytes(byte[] data, int offset)
Write an array of bytes into the pngBytes array.
protected intwriteBytes(byte[] data, int nBytes, int offset)
Write an array of bytes into the pngBytes array, specifying number of bytes to write.
protected voidwriteEnd()
Write a PNG "IEND" chunk into the pngBytes array.
protected voidwriteHeader()
Write a PNG "IHDR" chunk into the pngBytes array.
protected booleanwriteImageData()
Write the image data into the pngBytes array.
protected intwriteInt2(int n, int offset)
Write a two-byte integer into the pngBytes array at a given position.
protected intwriteInt4(int n, int offset)
Write a four-byte integer into the pngBytes array at a given position.
protected intwriteString(String s, int offset)
Write a string into the pngBytes array at a given position.

Field Detail

bytePos

protected int bytePos

bytesPerPixel

protected int bytesPerPixel

compressionLevel

protected int compressionLevel

crc

protected CRC32 crc

crcValue

protected long crcValue

dataPos

protected int dataPos

encodeAlpha

protected boolean encodeAlpha

endPos

protected int endPos

ENCODE_ALPHA

public static final boolean ENCODE_ALPHA
Constant specifying that alpha channel should be encoded.

filter

protected int filter

FILTER_LAST

public static final int FILTER_LAST

FILTER_NONE

public static final int FILTER_NONE
Constants for filters

FILTER_SUB

public static final int FILTER_SUB

FILTER_UP

public static final int FILTER_UP

hdrPos

protected int hdrPos

height

protected int height

image

protected Image image

leftBytes

protected byte[] leftBytes

maxPos

protected int maxPos

NO_ALPHA

public static final boolean NO_ALPHA
Constant specifying that alpha channel should not be encoded.

pngBytes

protected byte[] pngBytes

priorRow

protected byte[] priorRow

width

protected int width

Constructor Detail

PngEncoder

public PngEncoder()
Class constructor

PngEncoder

public PngEncoder(Image image)
Class constructor specifying Image to encode, with no alpha channel encoding.

Parameters: image A Java Image object which uses the DirectColorModel

See Also: java.awt.Image

PngEncoder

public PngEncoder(Image image, boolean encodeAlpha)
Class constructor specifying Image to encode, and whether to encode alpha.

Parameters: image A Java Image object which uses the DirectColorModel encodeAlpha Encode the alpha channel? false=no; true=yes

See Also: java.awt.Image

PngEncoder

public PngEncoder(Image image, boolean encodeAlpha, int whichFilter)
Class constructor specifying Image to encode, whether to encode alpha, and filter to use.

Parameters: image A Java Image object which uses the DirectColorModel encodeAlpha Encode the alpha channel? false=no; true=yes whichFilter 0=none, 1=sub, 2=up

See Also: java.awt.Image

PngEncoder

public PngEncoder(Image image, boolean encodeAlpha, int whichFilter, int compLevel)
Class constructor specifying Image source to encode, whether to encode alpha, filter to use, and compression level.

Parameters: image A Java Image object encodeAlpha Encode the alpha channel? false=no; true=yes whichFilter 0=none, 1=sub, 2=up compLevel 0..9

See Also: java.awt.Image

Method Detail

filterSub

protected void filterSub(byte[] pixels, int startPos, int width)
Perform "sub" filtering on the given row. Uses temporary array leftBytes to store the original values of the previous pixels. The array is 16 bytes long, which will easily hold two-byte samples plus two-byte alpha.

Parameters: pixels The array holding the scan lines being built startPos Starting position within pixels of bytes to be filtered. width Width of a scanline in pixels.

filterUp

protected void filterUp(byte[] pixels, int startPos, int width)
Perform "up" filtering on the given row. Side effect: refills the prior row with current row

Parameters: pixels The array holding the scan lines being built startPos Starting position within pixels of bytes to be filtered. width Width of a scanline in pixels.

getCompressionLevel

public int getCompressionLevel()
Retrieve compression level

Returns: int in range 0-9

getEncodeAlpha

public boolean getEncodeAlpha()
Retrieve alpha encoding status.

Returns: boolean false=no, true=yes

getFilter

public int getFilter()
Retrieve filtering scheme

Returns: int (see constant list)

pngEncode

byte[] pngEncode(boolean encodeAlpha)
Creates an array of bytes that is the PNG equivalent of the current image, specifying whether to encode alpha or not.

Parameters: encodeAlpha boolean false=no alpha, true=encode alpha

Returns: an array of bytes, or null if there was a problem

pngEncode

public byte[] pngEncode()
Creates an array of bytes that is the PNG equivalent of the current image. Alpha encoding is determined by its setting in the constructor.

Returns: an array of bytes, or null if there was a problem

resizeByteArray

protected byte[] resizeByteArray(byte[] array, int newLength)
Increase or decrease the length of a byte array.

Parameters: array The original array. newLength The length you wish the new array to have.

Returns: Array of newly desired length. If shorter than the original, the trailing elements are truncated.

setCompressionLevel

public void setCompressionLevel(int level)
Set the compression level to use

Parameters: level 0 through 9

setEncodeAlpha

public void setEncodeAlpha(boolean encodeAlpha)
Set the alpha encoding on or off.

Parameters: encodeAlpha false=no, true=yes

setFilter

public void setFilter(int whichFilter)
Set the filter to use

Parameters: whichFilter from constant list

setImage

public void setImage(Image image)
Set the image to be encoded

Parameters: image A Java Image object which uses the DirectColorModel

See Also: java.awt.Image java.awt.image.DirectColorModel

writeByte

protected int writeByte(int b, int offset)
Write a single byte into the pngBytes array at a given position.

Parameters: b The byte to be written into pngBytes. offset The starting point to write to.

Returns: The next place to be written to in the pngBytes array.

writeBytes

protected int writeBytes(byte[] data, int offset)
Write an array of bytes into the pngBytes array. Note: This routine has the side effect of updating maxPos, the largest element written in the array. The array is resized by 1000 bytes or the length of the data to be written, whichever is larger.

Parameters: data The data to be written into pngBytes. offset The starting point to write to.

Returns: The next place to be written to in the pngBytes array.

writeBytes

protected int writeBytes(byte[] data, int nBytes, int offset)
Write an array of bytes into the pngBytes array, specifying number of bytes to write. Note: This routine has the side effect of updating maxPos, the largest element written in the array. The array is resized by 1000 bytes or the length of the data to be written, whichever is larger.

Parameters: data The data to be written into pngBytes. nBytes The number of bytes to be written. offset The starting point to write to.

Returns: The next place to be written to in the pngBytes array.

writeEnd

protected void writeEnd()
Write a PNG "IEND" chunk into the pngBytes array.

writeHeader

protected void writeHeader()
Write a PNG "IHDR" chunk into the pngBytes array.

writeImageData

protected boolean writeImageData()
Write the image data into the pngBytes array. This will write one or more PNG "IDAT" chunks. In order to conserve memory, this method grabs as many rows as will fit into 32K bytes, or the whole image; whichever is less.

Returns: true if no errors; false if error grabbing pixels

writeInt2

protected int writeInt2(int n, int offset)
Write a two-byte integer into the pngBytes array at a given position.

Parameters: n The integer to be written into pngBytes. offset The starting point to write to.

Returns: The next place to be written to in the pngBytes array.

writeInt4

protected int writeInt4(int n, int offset)
Write a four-byte integer into the pngBytes array at a given position.

Parameters: n The integer to be written into pngBytes. offset The starting point to write to.

Returns: The next place to be written to in the pngBytes array.

writeString

protected int writeString(String s, int offset)
Write a string into the pngBytes array at a given position. This uses the getBytes method, so the encoding used will be its default.

Parameters: s The string to be written into pngBytes. offset The starting point to write to.

Returns: The next place to be written to in the pngBytes array.

See Also: java.lang.String#getBytes()