private RenderedImage mosaicHeterogeneousImages(List<ImageInTile> sources) { // at the time of writing, only JAI-EXT mosaic can handle a mix of different // color models, we need to use it explicitly RenderedImage image; final ParameterBlockJAI pb = new ParameterBlockJAI(new it.geosolutions.jaiext.mosaic.MosaicDescriptor()); for (ImageInTile it : sources) { if (it.posx != 0 || it.posy != 0) { ImageWorker iw = new ImageWorker(it.image); iw.translate( it.posx, it.posy, Interpolation.getInstance(Interpolation.INTERP_NEAREST)); RenderedImage translated = iw.getRenderedImage(); pb.addSource(translated); } else { pb.addSource(it.image); } } pb.setParameter("mosaicType", MosaicDescriptor.MOSAIC_TYPE_OVERLAY); pb.setParameter("sourceAlpha", null); pb.setParameter("sourceROI", null); pb.setParameter("sourceThreshold", null); pb.setParameter("backgroundValues", new double[] {0}); pb.setParameter("nodata", null); RenderingHints hints = new Hints(JAI.getDefaultInstance().getRenderingHints()); hints.putAll(GeoTools.getDefaultHints()); image = new MosaicRIF().create(pb, hints); return image; }
public static ParameterBlockJAI getParameterBlockJAIForImage(RenderedImage image, String op) { ParameterBlockJAI pb = new ParameterBlockJAI(op); pb.addSource(image); return pb; }
pbj.addSource(sourceImage); pbj.setParameter("stats", stats.toArray(new Statistic[stats.size()])); pbj.setParameter("bands", new Integer[] {band});
pbjImageWrite.addSource(image); pbjImageWrite.setParameter("Output", outstream); pbjImageWrite.setParameter("VerifyOutput", Boolean.FALSE);
private static RenderedOp createTargetImage(RasterDataNode sourceBand, String operationName, HashMap<String, Object> operationParameters, RenderingHints renderingHints) { final ParameterBlockJAI parameterBlock = new ParameterBlockJAI(operationName); parameterBlock.addSource(sourceBand.getSourceImage()); for (Map.Entry<String, Object> parameter : operationParameters.entrySet()) { try { parameterBlock.setParameter(parameter.getKey(), parameter.getValue()); } catch (IllegalArgumentException e) { throw new OperatorException(MessageFormat.format("Illegal parameter ''{0}'' for JAI operation ''{1}''.", parameter.getKey(), operationName), e); } } try { return JAI.create(operationName, parameterBlock, renderingHints); } catch (Exception e) { throw new OperatorException(MessageFormat.format("Illegal source or parameters for JAI operation ''{0}''.", operationName), e); } } }
pb.addSource(src); pb.setParameter("scaleX", new Double(1.0 / downsampleStep)); pb.setParameter("scaleY", new Double(1.0 / downsampleStep));
/** * This method has the objective of untiling the final image to write on * disk since we do not want to have tiles added to the file on disk causing * failures when reading it back into memory. * * @param image * Image to untile. * * @return Untiled image. */ private PlanarImage untileImage(RenderedImage image) { final ParameterBlockJAI pbj = new ParameterBlockJAI("format"); pbj.addSource(image); pbj.setParameter("dataType", image.getSampleModel().getTransferType()); final ImageLayout layout = new ImageLayout(image); layout.unsetTileLayout(); layout.setTileGridXOffset(0); layout.setTileGridYOffset(0); layout.setTileHeight(image.getHeight()); layout.setTileWidth(image.getWidth()); layout.setValid(ImageLayout.TILE_GRID_X_OFFSET_MASK | ImageLayout.TILE_GRID_Y_OFFSET_MASK | ImageLayout.TILE_HEIGHT_MASK | ImageLayout.TILE_WIDTH_MASK); final RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout); // avoid caching this image return JAI.create("format", pbj, hints); }
parameterBlock.addSource(inputImage);
parameterBlock.addSource(inputImage);
/** * Applies a unary operation on the current image using the given parameters. * * @param parameters The parameters, without any source. The current {@linkplain #image} * will be added directly as the source in the given parameter block. * @param checksum The checksum of the expected result, or 0 for ignoring it. */ protected final synchronized void applyUnary(final ParameterBlockJAI parameters, final long checksum) { final String operation = parameters.getOperationDescriptor().getName(); image = JAI.create(operation, parameters.addSource(image)); if (checksum != 0) { String message = "Checksum failed for operation \"" + operation + "\"."; assertEquals(message, checksum, Commons.checksum(image)); } } }
@Test public void testExpandGrayCaseC() { // create gray indexed image BufferedImage bi = new BufferedImage(10, 10, BufferedImage.TYPE_BYTE_GRAY); Graphics2D gr = bi.createGraphics(); gr.setColor(Color.GRAY); gr.fillRect(0, 0, 10, 10); gr.dispose(); // create a RGB color model final ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), false, false, Transparency.OPAQUE, bi.getSampleModel().getDataType()); // set the destination image layout final ImageLayout2 il = new ImageLayout2(bi); il.setColorModel(cm); il.setSampleModel(cm.createCompatibleSampleModel(bi.getWidth(), bi.getHeight())); RenderingHints ri = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, il); // perform color expansion ParameterBlockJAI pbj = new ParameterBlockJAI("ColorConvert"); pbj.addSource(bi); pbj.setParameter("colorModel", cm); pbj.setParameter("noData", RangeFactory.create(-1, -1)); RenderedOp finalimage = JAI.create("ColorConvert", pbj, ri); int[] pixel = new int[3]; finalimage.getData().getPixel(0, 0, pixel); assertEquals(128, pixel[0]); assertEquals(128, pixel[1]); assertEquals(128, pixel[2]); }
/** * Applies the operation and tests the result with the expected one, using checksum. */ @Test @Ignore("Fails randomly, need investigation.") public void testOnRGB() { loadSampleImage(SampleImage.RGB_ROTATED); ParameterBlockJAI parameters = new ParameterBlockJAI(SilhouetteMask.OPERATION_NAME); RenderedImage mask = JAI.create(SilhouetteMask.OPERATION_NAME, parameters.addSource(image)); final double[] blueColor = new double[] {64, 64, 255}; parameters = new ParameterBlockJAI(Mask.OPERATION_NAME); image = JAI.create(Mask.OPERATION_NAME, parameters.addSource(image).addSource(mask).set(blueColor, 0)); assertCurrentChecksumEquals("testOnRGB", 2300860193L, 3418587197L); showCurrentImage("testOnRGB"); }
/** * Applies the operation and tests the result with the expected one, using checksum. */ @Test @Ignore("Fails randomly, need investigation.") public void testOnIndexed() { loadSampleImage(SampleImage.INDEXED); ParameterBlockJAI parameters = new ParameterBlockJAI(SilhouetteMask.OPERATION_NAME); parameters.setParameter("background", new double[][] {{255}}); RenderedImage mask = JAI.create(SilhouetteMask.OPERATION_NAME, parameters.addSource(image)); final double[] newValues = new double[] {0}; parameters = new ParameterBlockJAI(Mask.OPERATION_NAME); image = JAI.create(Mask.OPERATION_NAME, parameters.addSource(image).addSource(mask).set(newValues, 0)); assertCurrentChecksumEquals("testOnIndexed", 3577749049L); showCurrentImage("testOnIndexed"); } }
@Test public void testEqualInterval() throws Exception { RenderedImage image = createImage(); ParameterBlockJAI pb = new ParameterBlockJAI(new ClassBreaksDescriptor()); pb.addSource(image); pb.setParameter("method", ClassificationMethod.EQUAL_INTERVAL); pb.setParameter("numClasses", 4); RenderedImage op = JAI.create("ClassBreaks", pb, null); Classification classification = (Classification) op.getProperty(ClassBreaksDescriptor.CLASSIFICATION_PROPERTY); assertNotNull(classification); Number[] breaks = classification.getBreaks()[0]; assertEquals(5, breaks.length); assertEquals(1, breaks[0].doubleValue(), EPS); assertEquals(14, breaks[1].doubleValue(), EPS); assertEquals(27, breaks[2].doubleValue(), EPS); assertEquals(40, breaks[3].doubleValue(), EPS); assertEquals(53, breaks[4].doubleValue(), EPS); }
@Test public void testNaturalBreaks() throws Exception { RenderedImage image = createImage(); ParameterBlockJAI pb = new ParameterBlockJAI(new ClassBreaksDescriptor()); pb.addSource(image); pb.setParameter("method", ClassificationMethod.NATURAL_BREAKS); pb.setParameter("numClasses", 4); RenderedImage op = JAI.create("ClassBreaks", pb, null); Classification classification = (Classification) op.getProperty(ClassBreaksDescriptor.CLASSIFICATION_PROPERTY); assertNotNull(classification); Number[] breaks = classification.getBreaks()[0]; // 4 classes, 5 breaks assertEquals(5, breaks.length); assertEquals(1, breaks[0].doubleValue(), EPS); assertEquals(3, breaks[1].doubleValue(), EPS); assertEquals(16, breaks[2].doubleValue(), EPS); assertEquals(26, breaks[3].doubleValue(), EPS); assertEquals(53, breaks[4].doubleValue(), EPS); }
@Test public void testQuantileBreaks() throws Exception { RenderedImage image = createImage(); ParameterBlockJAI pb = new ParameterBlockJAI(new ClassBreaksDescriptor()); pb.addSource(image); pb.setParameter("method", ClassificationMethod.QUANTILE); pb.setParameter("numClasses", 4); RenderedImage op = JAI.create("ClassBreaks", pb, null); Classification classification = (Classification) op.getProperty(ClassBreaksDescriptor.CLASSIFICATION_PROPERTY); assertNotNull(classification); Number[] breaks = classification.getBreaks()[0]; // 4 classes, 5 breaks // 1, 1, 2, // 3, 3, 8, 8, 9, // 11, 14, 16, 24, // 26, 26, 45, 53 assertEquals(5, breaks.length); assertEquals(1, breaks[0].doubleValue(), EPS); assertEquals(3, breaks[1].doubleValue(), EPS); assertEquals(11, breaks[2].doubleValue(), EPS); assertEquals(26, breaks[3].doubleValue(), EPS); assertEquals(53, breaks[4].doubleValue(), EPS); }
@Test public void testNaturalBreaksHistogram() throws Exception { RenderedImage image = createImage(); ParameterBlockJAI pb = new ParameterBlockJAI(new ClassBreaksDescriptor()); pb.addSource(image); pb.setParameter("method", ClassificationMethod.NATURAL_BREAKS); pb.setParameter("numClasses", 4); pb.setParameter("extrema", getExtrema(image)); pb.setParameter("histogram", true); pb.setParameter("histogramBins", 100); RenderedImage op = JAI.create("ClassBreaks", pb, null); Classification classification = (Classification) op.getProperty(ClassBreaksDescriptor.CLASSIFICATION_PROPERTY); assertNotNull(classification); Number[] breaks = classification.getBreaks()[0]; // 4 classes, 5 breaks assertEquals(5, breaks.length); assertEquals(1, breaks[0].doubleValue(), EPS); assertEquals(3, breaks[1].doubleValue(), EPS); assertEquals(16, breaks[2].doubleValue(), EPS); assertEquals(26, breaks[3].doubleValue(), EPS); assertEquals(53, breaks[4].doubleValue(), EPS); }
@Test public void testQuantileBreaksHistogram() throws Exception { RenderedImage image = createImage(); ParameterBlockJAI pb = new ParameterBlockJAI(new ClassBreaksDescriptor()); pb.addSource(image); pb.setParameter("method", ClassificationMethod.QUANTILE); pb.setParameter("numClasses", 4); pb.setParameter("extrema", getExtrema(image)); pb.setParameter("histogram", true); pb.setParameter("histogramBins", 100); RenderedImage op = JAI.create("ClassBreaks", pb, null); Classification classification = (Classification) op.getProperty(ClassBreaksDescriptor.CLASSIFICATION_PROPERTY); assertNotNull(classification); Number[] breaks = classification.getBreaks()[0]; // 4 classes, 5 breaks (not the same as the exact count, slightly different approach, // but still correct) // 1, 1, 2, 3, 3, // 8, 8, 9, // 11, 14, 16, 24, // 26, 26, 45, 53 assertEquals(5, breaks.length); assertEquals(1, breaks[0].doubleValue(), EPS); assertEquals(8, breaks[1].doubleValue(), EPS); assertEquals(11, breaks[2].doubleValue(), EPS); assertEquals(26, breaks[3].doubleValue(), EPS); assertEquals(53, breaks[4].doubleValue(), EPS); }
params.setParameter("xScale", 2.0f); params.setParameter("yScale", 3.0f); params.addSource(sourceImage); final RenderedOp renderedOp1 = JAI.create("scale", params); params.setParameter("offsets", new double[]{0.5, 0.5, 0.5, 0.5}); params.setParameter("constants", new double[]{1.5, 1.5, 1.5, 1.5}); params.addSource(renderedOp1); final RenderedOp renderedOp2 = JAI.create("rescale", params); params.setParameter("xScale", 0.5f); params.setParameter("yScale", 3.3f); params.addSource(sourceImage); renderedOp1.setParameterBlock(params);
@Test public void getMissingProperty() { RenderedImage image = createImage(); ParameterBlockJAI pb = new ParameterBlockJAI(new ClassBreaksDescriptor()); pb.addSource(image); pb.setParameter("method", ClassificationMethod.QUANTILE); pb.setParameter("numClasses", 5); // raw creation like in CoverageClassStats, otherwise the issue gets masked by JAI wrappers RenderedImage op = new ClassBreaksRIF().create(pb, null); // used to NPE here Object roi = op.getProperty("ROI"); assertEquals(Image.UndefinedProperty, roi); }