geotools-gcs.jar
file declares a service provider for the
following image readers:
{@link javax.imageio.ImageReader} subclass | Name | MIME type |
---|---|---|
{@link org.geotools.io.image.RawBinaryImageReader} | raw | image/raw |
{@link org.geotools.io.image.TextMatrixImageReader} | matrix | text/matrix |
{@link org.geotools.io.image.TextRecordImageReader} | gridded records | text/x-grid |
{@link org.geotools.io.image.SimpleImageReader} 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 kinds of stream are not uncommon in the remote sensing field. They often contain geophysical values (e.g. temperature in Celsius degrees, elevation in metres, etc.) better represented as floating point numbers than integers. For example, a user may want to read an ASCII file containing gridded elevation on the ocean floor (left side below). {@link org.geotools.io.image.TextRecordImageReader} can read such file, detect automatically minimum and maximum values (in order to scale the grayscale palette) and produce the image below:
Longitude Latitude Altitude 59.9000 -30.0000 -3022 59.9333 -30.0000 -3194 59.9667 -30.0000 -3888 60.0000 -30.0000 -3888 45.0000 -29.9667 -2502 45.0333 -29.9667 -2502 45.0667 -29.9667 -2576 45.1000 -29.9667 -2576 45.1333 -29.9667 -2624 45.1667 -29.9667 -2690 45.2000 -29.9667 -2690 45.2333 -29.9667 -2692 45.2667 -29.9667 -2606 45.3000 -29.9667 -2606 45.3333 -29.9667 -2528etc... |
![]() |
By default, {@link org.geotools.io.image.SimpleImageReader} store decoded image using data type {@link java.awt.image.DataBuffer#TYPE_FLOAT} and a grayscale color space. This politic produce image matching closely the original data, i.e. it involves as few transformations as possible. But displaying floating-point image is usually very slow. User are strongly encourages to use Java Advanced Imaging's operations after reading in order to scale data as they see fit. The example below reformat the {@link java.awt.image.DataBuffer#TYPE_FLOAT} data into {@link java.awt.image.DataBuffer#TYPE_BYTE} and change 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); |