/* * Geotoolkit.org - An Open Source Java GIS Toolkit * http://www.geotoolkit.org * * (C) 2013, Geomatys * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. */ package org.geotoolkit.processing.coverage.bandselect; import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import java.util.Hashtable; import org.geotoolkit.coverage.GridSampleDimension; import org.geotoolkit.coverage.grid.GridCoverage2D; import org.geotoolkit.coverage.grid.GridCoverageBuilder; import org.geotoolkit.parameter.Parameters; import org.geotoolkit.process.Process; import org.geotoolkit.processing.AbstractProcess; import org.geotoolkit.process.ProcessDescriptor; import org.geotoolkit.process.ProcessException; import org.opengis.parameter.ParameterValueGroup; import org.apache.sis.util.ArgumentChecks; import org.geotoolkit.image.BufferedImages; import org.geotoolkit.utility.parameter.ParametersExt; /** * * @author Johann Sorel (Geomatys) */ public class BandSelectProcess extends AbstractProcess { public BandSelectProcess(ParameterValueGroup input) { super(BandSelectDescriptor.INSTANCE, input); } /** * * @param coverage Coverage to process * @param bands bands to select for output */ public BandSelectProcess(GridCoverage2D coverage, int[] bands){ super(BandSelectDescriptor.INSTANCE, asParameters(coverage,bands)); } private static ParameterValueGroup asParameters(GridCoverage2D coverage, int[] bands){ final ParameterValueGroup params = BandSelectDescriptor.INPUT_DESC.createValue(); ParametersExt.getOrCreateValue(params, BandSelectDescriptor.IN_COVERAGE.getName().getCode()).setValue(coverage); ParametersExt.getOrCreateValue(params, BandSelectDescriptor.IN_BANDS.getName().getCode()).setValue(bands); return params; } /** * Execute process now. * * @return result coverage * @throws ProcessException */ public GridCoverage2D executeNow() throws ProcessException { execute(); return (GridCoverage2D) outputParameters.parameter(BandSelectDescriptor.OUT_COVERAGE.getName().getCode()).getValue(); } @Override protected void execute() throws ProcessException { ArgumentChecks.ensureNonNull("inputParameter", inputParameters); final GridCoverage2D inputCoverage = (GridCoverage2D) Parameters.getOrCreate(BandSelectDescriptor.IN_COVERAGE, inputParameters).getValue(); final int[] bands = (int[]) Parameters.getOrCreate(BandSelectDescriptor.IN_BANDS, inputParameters).getValue(); // CALL IMAGE BAND SELECT ////////////////////////////////////////////// final ProcessDescriptor imageSelectDesc = org.geotoolkit.processing.image.bandselect.BandSelectDescriptor.INSTANCE; final ParameterValueGroup params = imageSelectDesc.getInputDescriptor().createValue(); params.parameter("image").setValue(inputCoverage.getRenderedImage()); params.parameter("bands").setValue(bands); final Process process = imageSelectDesc.createProcess(params); BufferedImage resultImage = (BufferedImage)process.call().parameter("result").getValue(); // BUILD A BETTER COLOR MODEL ////////////////////////////////////////// //TODO try to reuse java colormodel if possible //extract grayscale min/max from sample dimension final GridSampleDimension gridSample = inputCoverage.getSampleDimension(0); final ColorModel graycm = BufferedImages.createGrayScaleColorModel( resultImage.getSampleModel().getDataType(), resultImage.getSampleModel().getNumBands(),0, gridSample.getMinimumValue(), gridSample.getMaximumValue()); resultImage = new BufferedImage(graycm, resultImage.getRaster(), false, new Hashtable<Object, Object>()); // REBUILD COVERAGE //////////////////////////////////////////////////// final GridCoverageBuilder gcb = new GridCoverageBuilder(); gcb.setRenderedImage(resultImage); gcb.setGridGeometry(inputCoverage.getGridGeometry()); final GridCoverage2D resultCoverage = gcb.getGridCoverage2D(); Parameters.getOrCreate(BandSelectDescriptor.OUT_COVERAGE, outputParameters).setValue(resultCoverage); } }