PngEncoder - convert a Java Image to PNG
PngEncoderB - convert a Java BufferedImage to PNG
Written by J. David Eisenberg
(home page)
version 1.5 (see change log)
Purpose
The PngEncoder class takes a Java Image as its
input and produces a byte array in PNG format. This array can be saved in
a file or sent to a client by a servlet.
This functionality is now included in the
javax.imageio library that comes with Java 1.4.1,
but PngEncoder may be useful for those who don’t want to require the
latest version of Java.
The source Image is presumed to be based on the Java
DirectColorModel; that is, pixels are four-byte ints
containing alpha channel, red, green, and blue information.
Thus, this PNG encoder creates PNGs with a color type of 2 (that is,
RGB triples) and a bit depth of 8, optionally encoding
alpha channel information.
This class does not work with
an IndexColorModel image.
Image data may be pre-filtered using the “sub” (previous byte)
and “up” (previous row) filters.
You may also set the compression level (0 through 9) as used
in java.utils.zip.Deflater
The PngEncoderB class has been designed to allow encoding
of images that are based on an indexed color model with a palette.
PngEncoderB takes a Java BufferedImage as its
input and produces a corresponding set of PNG bytes. Because it
uses a BufferedImage, this class requires Java 1.2.
Example for PngEncoder
You may see a sample program which
draws an clock face and saves it in an appropriately named file.
That is, if you use the program at 3:24 PM, and specify filter
two with a compression level of 5, it will display a
clock face and save that same image in a file named
clock1524_f25.png.
Its usage is as follows:
Usage: TestEncoder -alpha -filter n -compress c
alpha means to use alpha encoding (default none)
n is filter number 0=none (default), 1=sub, 2=up
c is compression factor (0-9)
Example for PngEncoderB
This sample program also
draws an clock face and saves it in an appropriately named file.
The file name is constructed as in the example above, except
that the name ends in d if the image is 24-bit (direct
color) and i if 8-bit (indexed color). An example
file name might be clock1524_f25d.png.
Its usage is as follows:
Usage: TestEncoderB -alpha -filter n -compress c -depth d
-alpha means to use alpha encoding (default none)
n is filter number 0=none (default), 1=sub, 2=up
c is compression factor (0-9); 1 default
d is pixel depth (8 or 24 bit); 24 default
Source
You may see the
source code for PngEncoder.java
or
PngEncoderB.java
here. You may also download the entire package
as a TAR-gzip
file or
as a .zip file.
The API documentation is here.
License
This program 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
of the License, or (at your option) any later version.
References/Acknowledgments
Thanks to Jay Denny of KeyPoint Software,
who let me develop this on company time.
Information from the PNG
Specification was immensely useful in developing this code.
The specification is also available
in many forms
and from many mirrors.
Back to Dave Eisenberg's home page