package org.openjump.core.ui.plugin.raster.color; import java.awt.Color; import java.awt.geom.NoninvertibleTransformException; import java.awt.image.BufferedImage; import java.awt.image.Raster; import javax.media.jai.PlanarImage; import org.openjump.core.rasterimage.RasterImageLayer; import org.openjump.core.ui.color.ColorGenerator; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jump.workbench.model.LayerEventType; import com.vividsolutions.jump.workbench.WorkbenchContext; /** * @author plouy_p * * */ /** * 15 sept. 2005 * * @author Paul PLOUY * Laboratoire RESO - universit� de Rennes 2 * FRANCE * * modified by Stefan Steiniger (perriger@gmx.de) * */ public class RasterColorEditor { private RasterImageLayer layer; private ColorGenerator colorGenerator; public RasterColorEditor(RasterImageLayer Rlayer) { setRasterLayer(Rlayer); } public void setRasterLayer(RasterImageLayer Rlayer) { this.layer = Rlayer; } public RasterImageLayer getRasterImageLayer() { return layer; } /* * This method apply a new set of Colors to the RasterLayer It has to read * the raster data, build new categories, create a new GridCoverage and * apply it to the RasterLayer */ public void changeColors(WorkbenchContext context, Color[] colors, Color noDataColor, float min, float max) throws NoninvertibleTransformException { if (colors == null || colors.length == 0) { layer.setNeedToKeepImage(false); layer.flushImages(true); layer.setEnvelope(layer.getEnvelope()); context.getLayerViewPanel().getViewport().update(); return; } colorGenerator = new ColorGenerator(35, colors); Raster raster = layer.getRasterData(); /** * TODO: make the stuff below work. Not sure how, becasue * the three GeoTools classes have a lot of dependencies... * so one should use the geotools lib directly??? */ /* final String path; final Unit unit = null; final Category[] categories; final CoordinateReferenceSystem crs; final Rectangle2D bounds; Category[] categories = new Category[] { new Category("val1", color1, new NumberRange(1, 255), new NumberRange(min, max)), new Category("val2", noDataColor, 0) }; GridSampleDimension GSD = new GridSampleDimension(categories, null); GSD = GSD.geophysics(true); int width = image.getData().getWidth(); int height = image.getData().getHeight(); WritableRaster data = RasterFactory.createBandedRaster( java.awt.image.DataBuffer.TYPE_FLOAT, width, height, 1, null); WritableRaster oldData = (WritableRaster) image.getData(); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { data.setSample(j, i, 0, oldData.getSampleFloat(j, i, 0)); } } */ //OpenJUMPSextanteRasterLayer ojraster = new OpenJUMPSextanteRasterLayer(); //ojraster.create(layer); //double rasterMaxValue = ojraster.getMaxValue(); //double rasterMinValue = ojraster.getMinValue(); int width = raster.getWidth(); int height = raster.getHeight(); BufferedImage newImage = new BufferedImage(width, height, BufferedImage.TYPE_4BYTE_ABGR); int numOfSteps = colorGenerator.getSteps(); for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { float value = raster.getSampleFloat(j, i, 0); if (value == Double.POSITIVE_INFINITY) { newImage.setRGB(j, i, Color.TRANSLUCENT); } else { int intColor = (int) ((value - min) / (max - min) * (numOfSteps-1)); /* black color indicates that value is out of the min/max area: */ if (intColor >= numOfSteps || intColor < 0) { newImage.setRGB(j, i, Color.BLACK.getRGB()); } else { Color newColor = colorGenerator.getColor(intColor); if (newColor==null) { //newImage.setRGB(j, i, Color.BLACK.getRGB()); } newImage.setRGB(j, i, newColor.getRGB()); } } } } /** * TODO: make this work */ /* BufferedImage BufImage = new BufferedImage(GSD.getColorModel(), data, false, null); */ PlanarImage pimage = PlanarImage.wrapRenderedImage(newImage); /* System.out.println("databuffer: " + newImage.getRaster().getDataBuffer() + "samplemodel: " + newImage.getRaster().getSampleModel()); */ layer.setNeedToKeepImage(true); layer.setImage(pimage); layer.setEnvelope(layer.getEnvelope()); context.getLayerViewPanel().getViewport().update(); } }