Extensions to {@link javax.imageio.ImageReader} for binary and ASCII files.

{@link org.geotools.image.io.StreamImageReader} is the base class for image decoders reading stream with few (if any) meta-data. Examples of such streams are matrix containing the pixels values in a binary form (RAW images), or ASCII files containing values written as decimal numbers. Such files contain often geophysical values (e.g. temperature in Celsius degrees, elevation in metres, etc.) better represented as floating point numbers than integers.

By default, {@link org.geotools.image.io.StreamImageReader} stores decoded image using data type {@link java.awt.image.DataBuffer#TYPE_FLOAT} and a grayscale color space. This politic produce images matching closely the original data, i.e. it involves as few transformations as possible. But displaying floating-point images is usually very slow. Users are strongly encouraged to use Java Advanced Imaging's operations after reading in order to scale data as they see fit. The example below reformats the {@link java.awt.image.DataBuffer#TYPE_FLOAT} data into {@link java.awt.image.DataBuffer#TYPE_BYTE} and changes the grayscale colors to an indexed color model.

 


import {@link javax.media.jai.JAI javax.media.jai.JAI};
import {@link javax.media.jai.ImageLayout javax.media.jai.ImageLayout};
import {@link java.awt.RenderingHints java.awt.RenderingHints};
import {@link java.awt.image.DataBuffer java.awt.image.DataBuffer};
import {@link java.awt.image.IndexColorModel java.awt.image.IndexColorModel};
import {@link java.awt.image.renderable.ParameterBlock java.awt.image.renderable.ParameterBlock};

// Omitting class and method declaration...


/*
 * Prepare the indexed color model. Arrays
 * R, G and B should contains 256 RGB values.
 */
final byte[] R=...
final byte[] G=...
final byte[] B=...
final IndexColorModel colors = new IndexColorModel(8, 256, R,G,B);
final ImageLayout     layout = new ImageLayout().setColorModel(colorModel);
final RenderingHints   hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout);

/*
 * Rescale the image.   First, all pixels values are transformed using
 * the equation pi=CO+C1*p. Then, type float is clamp to type byte and
 * the new index color model is set.   Displaying such an image should
 * be much faster.
 */
final double C0 = ...
final double C1 = ...
image = JAI.create("Rescale", new ParameterBlock().addSource(image).add(new double[]{C1}).add(new double[]{C0}));
image = JAI.create("Format",  new ParameterBlock().addSource(image).add(DataBuffer.TYPE_BYTE), hints);