package it.geosolutions.imageio.plugins.slices2D;
import java.awt.Transparency;
import java.awt.color.ColorSpace;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ComponentColorModel;
import java.awt.image.DataBuffer;
import java.awt.image.SampleModel;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.logging.Logger;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.spi.ImageReaderSpi;
import com.sun.media.imageioimpl.common.ImageUtil;
import com.sun.media.jai.codecimpl.util.RasterFactory;
/**
* An abstract super class which need to be extended by any specific format's
* ImageReader
to work with 2D datasets.
*
* @author Romagnoli Daniele
*/
public abstract class SliceImageReader extends ImageReader implements
IndexManager {
private static final Logger LOGGER = org.geotools.util.logging.Logging.getLogger("it.geosolutions.imageio.plugins.slices2D");
/** set it to true
when initialization has been performed */
protected boolean isInitialized = false;
/** The originating File
*/
protected File originatingFile = null;
protected SliceImageReader(ImageReaderSpi originatingProvider) {
super(originatingProvider);
}
/** Implements this method to allow structure initialization. */
protected abstract void initialize() throws IOException;
public abstract int getHeight(int imageIndex) throws IOException;
public abstract int getWidth(int imageIndex) throws IOException;
/**
* Specific implementation of the read Operation. Any format's reader need
* to implement its own version of the read operation.
*/
public abstract BufferedImage read(int imageIndex, ImageReadParam param)
throws IOException;
/** return imageMetadata related to a specific product or subdataset. */
public abstract IIOMetadata getImageMetadata(int imageIndex)
throws IOException;
/** return streamMetadata related to the whole source. */
public abstract IIOMetadata getStreamMetadata() throws IOException;
public abstract Iterator getImageTypes(int imageIndex) throws IOException;
/**
* Utilty method returning a proper ColorModel
given an input
* SampleModel
*
* @param sm
* The SampleModel
for which we need to create a
* compatible ColorModel
.
*
* @return the created ColorModel
*/
protected ColorModel retrieveColorModel(final SampleModel sm) {
final int nBands = sm.getNumBands();
final int bufferType = sm.getDataType();
ColorModel cm = null;
ColorSpace cs = null;
if (nBands > 1) {
// Number of Bands > 1.
// ImageUtil.createColorModel provides to Creates a
// ColorModel that may be used with the specified
// SampleModel
cm = ImageUtil.createColorModel(sm);
if (cm == null)
LOGGER.info("There are no ColorModels found");
} else if ((bufferType == DataBuffer.TYPE_BYTE)
|| (bufferType == DataBuffer.TYPE_USHORT)
|| (bufferType == DataBuffer.TYPE_INT)
|| (bufferType == DataBuffer.TYPE_FLOAT)
|| (bufferType == DataBuffer.TYPE_DOUBLE)) {
// Just one band. Using the built-in Gray Scale Color Space
cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
cm = RasterFactory.createComponentColorModel(bufferType, // dataType
cs, // color space
false, // has alpha
false, // is alphaPremultiplied
Transparency.OPAQUE); // transparency
} else {
if (bufferType == DataBuffer.TYPE_SHORT) {
// Just one band. Using the built-in Gray Scale Color
// Space
cs = ColorSpace.getInstance(ColorSpace.CS_GRAY);
cm = new ComponentColorModel(cs, false, false,
Transparency.OPAQUE, DataBuffer.TYPE_SHORT);
}
}
return cm;
}
}