A codec to write Compuserve GIF (Graphics Interchange Format) files.
Only writing GIF files is supported right now.
Reading GIF files with JIU can be done with the
ToolkitLoader
class which uses the image reader built into the Java runtime library (
java.awt.Toolkit
class).
That reader has supported GIF since Java 1.0.
Supported image types
When saving, classes implementing the following image data interfaces
are supported:
BilevelImage
,
Gray8Image
and
Paletted8Image
.
GIF only supports up to 256 colors in an image, so
you will have to use one of the quantization classes to reduce
a truecolor image to 256 or less colors before you can save it
with this codec.
Supported I/O classes
This codec supports
java.io.OutputStream
,
java.io.DataOutput
and
java.io.RandomAccessFile
.
Bounds
ImageCodec
's bounds concept is supported.
A user of this codec can specify a rectangular part of the input image
that will be saved instead of the complete image.
Comments
GIF - at least in its 89a version - allows for the inclusion of textual
comments.
When saving an image to a GIF file, each comment given to a codec
will be stored in a comment extension block of its own.
Usage example
Save an image using this codec:
GIFCodec codec = new GIFCodec();
codec.appendComment("Bob and Susan at the Munich airport (2002-06-13).");
codec.setImage(image); // BilevelImage, Gray8Image or Paletted8Image
codec.setInterlacing(true);
codec.setFile("output.gif", CodecMode.SAVE);
codec.process();
codec.close();
Interlaced storage
This codec allows creating interlaced and non-interlaced GIF files.
The default is non-interlaced storage.
Non-interlaced files store the rows top-to-bottom.
Interlaced files store the image in four passes, progressively adding
rows until the complete image is stored.
When decoding, the progressive display of interlaced files makes it
supposedly quicker to find out what's displayed in the image.
On the other hand, transmission typically takes longer, because interlacing
often leads to slightly larger files.
When using interlaced mode, lines that get stored one after another
have some room between them in the image, so there are less similarities
between consecutive lines, which worsens compression ratio (compression
works better with a lot of similarities in the data to be compressed).
GIF versions
There are two versions of GIF, 87a and 89a.
In 89a, several things were added to the file format specification.
From the 89a features this codec only uses the possibility of storing textual comments
in GIF files.
Thus, the version used for writing depends on the return value of
getNumComments()
.
If there is at least one comment to be written to the file, version 89a
will be used, 87a otherwise.
Licensing of the LZW algorithm
Unisys Corp. had a patent in several countries on the LZW algorithm used within GIF.
However, this patent has expired (Japan being the last country
where the patent expired, on July 7th 2004) so that LZW can be used freely.
Licensing of the file format
GIF was defined by Compuserve.
In a technical document file called
Gif89a.txt
that I found
somewhere on the Net they grant a royalty-free license for use of the
format to anyone - in order to improve the popularity of the format, I guess.
I don't think that it should be possible to put a file format under a copyright,
but all that Compuserve asks for in exchange for freely using the format
is the inclusion of a message.
So, here is that message:
"The Graphics Interchange Format(c) is the Copyright property of
CompuServe Incorporated. GIF(sm) is a Service Mark property of
CompuServe Incorporated."
Animated GIFs
GIF allows for animations to be stored. This codec only supports storing
a single image, though.
File format background
I've compiled a web page with
technical
information on GIF.
CODE_ARRAY_LENGTH
private static final int CODE_ARRAY_LENGTH
INTERLACING_FIRST_ROW
private static final int[] INTERLACING_FIRST_ROW
INTERLACING_INCREMENT
private static final int[] INTERLACING_INCREMENT
MAGIC_GIF87A
private static final byte[] MAGIC_GIF87A
MAGIC_GIF89A
private static final byte[] MAGIC_GIF89A
NUM_INTERLACING_PASSES
private static final int NUM_INTERLACING_PASSES
backgroundColor
private int backgroundColor
bitOffset
private int bitOffset
bitsPerPixel
private int bitsPerPixel
block
private byte[] block
blockLength
private int blockLength
clearCode
private int clearCode
codeSize
private int codeSize
currentCode
private int[] currentCode
currentColumn
private int currentColumn
currentInterlacingPass
private int currentInterlacingPass
currentRow
private int currentRow
endOfInformationCode
private int endOfInformationCode
freeCode
private int freeCode
initialCodeSize
private int initialCodeSize
interlaced
private boolean interlaced
maxCode
private int maxCode
newCode
private int[] newCode
notFinished
private boolean notFinished
oldCode
private int[] oldCode
out
private DataOutput out
processedRows
private int processedRows
getBackgroundColor
public int getBackgroundColor()
Returns the index of the background color.
- int value with the color (index into the palette) of the background color
getNextSample
private int getNextSample()
initEncoding
private void initEncoding()
throws IOException
isInterlaced
public boolean isInterlaced()
Returns if the image will be stored in interlaced (true
)
or non-interlaced mode (false
).
resetBlock
private void resetBlock()
resetEncoder
private void resetEncoder()
setBackgroundColor
public void setBackgroundColor(int colorIndex)
Specify the value of the background color.
Default is 0
.
colorIndex
- int value with the color (index into the palette) of the background color
setInterlacing
public void setInterlacing(boolean useInterlacing)
Specifies whether the image will be stored in interlaced mode
(true
) or non-interlaced mode (false
).
useInterlacing
- boolean, if true interlaced mode, otherwise non-interlaced mode
writeBlock
private void writeBlock()
throws IOException
writeCode
private void writeCode(int code)
throws IOException
writeComments
private void writeComments()
throws IOException
writeHeader
private void writeHeader()
throws IOException
Writes a global header, a global palette and
an image descriptor to output.
writeImage
private void writeImage()
throws IOException
writePalette
private void writePalette()
throws IOException
writeShort
private void writeShort(int value)
throws IOException
writeStream
private void writeStream()
throws IOException
writeTrailer
private void writeTrailer()
throws IOException