Class GIFCodec


  • public class GIFCodec
    extends ImageCodec
    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 (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 OutputStream, DataOutput and 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 ImageCodec.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.
    Author:
    Marco Schmidt
    • Field Detail

      • INTERLACING_FIRST_ROW

        private static final int[] INTERLACING_FIRST_ROW
      • INTERLACING_INCREMENT

        private static final int[] INTERLACING_INCREMENT
      • NUM_INTERLACING_PASSES

        private static final int NUM_INTERLACING_PASSES
        See Also:
        Constant Field Values
      • MAGIC_GIF87A

        private static final byte[] MAGIC_GIF87A
      • MAGIC_GIF89A

        private static final byte[] MAGIC_GIF89A
      • backgroundColor

        private int backgroundColor
      • block

        private byte[] block
      • bitOffset

        private int bitOffset
      • bitsPerPixel

        private int bitsPerPixel
      • 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
      • notFinished

        private boolean notFinished
      • freeCode

        private int freeCode
      • initialCodeSize

        private int initialCodeSize
      • interlaced

        private boolean interlaced
      • height

        private int height
      • maxCode

        private int maxCode
      • newCode

        private int[] newCode
      • oldCode

        private int[] oldCode
      • processedRows

        private int processedRows
      • width

        private int width
    • Constructor Detail

      • GIFCodec

        public GIFCodec()
    • Method Detail

      • getBackgroundColor

        public int getBackgroundColor()
        Returns the index of the background color.
        Returns:
        int value with the color (index into the palette) of the background color
        See Also:
        setBackgroundColor(int)
      • getFileExtensions

        public String[] getFileExtensions()
        Description copied from class: ImageCodec
        Returns all file extensions that are typical for this file format. The default implementation in ImageCodec returns null. The file extension strings should include a leading dot and are supposed to be lower case (if that is allowed for the given file format). Example: {".jpg", ".jpeg"} for the JPEG file format.
        Overrides:
        getFileExtensions in class ImageCodec
        Returns:
        String array with typical file extensions
      • getFormatName

        public String getFormatName()
        Description copied from class: ImageCodec
        Returns the name of the file format supported by this codec. All classes extending ImageCodec must override this method. When overriding, leave out any words in a particular language so that this format name can be understood by everyone. Usually it is enough to return the format creator plus a typical abbreviation, e.g. Microsoft BMP or Portable Anymap (PNM).
        Specified by:
        getFormatName in class ImageCodec
        Returns:
        name of the file format supported by this codec
      • getMimeTypes

        public String[] getMimeTypes()
        Description copied from class: ImageCodec
        Return the MIME (Multipurpose Internet Mail Extensions) type strings for this format, or null if none are available.
        Specified by:
        getMimeTypes in class ImageCodec
        Returns:
        MIME type strings or null
      • getNextSample

        private int getNextSample()
      • isInterlaced

        public boolean isInterlaced()
        Returns if the image will be stored in interlaced (true) or non-interlaced mode (false).
        Returns:
        interlacing mode
        See Also:
        setInterlacing(boolean)
      • isLoadingSupported

        public boolean isLoadingSupported()
        Description copied from class: ImageCodec
        Returns if this codec is able to load images in the file format supported by this codec. If true is returned this does not necessarily mean that all files in this format can be read, but at least some.
        Specified by:
        isLoadingSupported in class ImageCodec
        Returns:
        if loading is supported
      • isSavingSupported

        public boolean isSavingSupported()
        Description copied from class: ImageCodec
        Returns if this codec is able to save images in the file format supported by this codec. If true is returned this does not necessarily mean that all types files in this format can be written, but at least some.
        Specified by:
        isSavingSupported in class ImageCodec
        Returns:
        if saving is supported
      • resetBlock

        private void resetBlock()
      • resetEncoder

        private void resetEncoder()
      • setBackgroundColor

        public void setBackgroundColor​(int colorIndex)
        Specify the value of the background color. Default is 0.
        Parameters:
        colorIndex - int value with the color (index into the palette) of the background color
        See Also:
        getBackgroundColor()
      • setInterlacing

        public void setInterlacing​(boolean useInterlacing)
        Specifies whether the image will be stored in interlaced mode (true) or non-interlaced mode (false).
        Parameters:
        useInterlacing - boolean, if true interlaced mode, otherwise non-interlaced mode
        See Also:
        isInterlaced()
      • writeHeader

        private void writeHeader()
                          throws IOException
        Writes a global header, a global palette and an image descriptor to output.
        Throws:
        IOException