Multi-level Source Image
Product product = new Product("test", "test", width, height); product.setPreferredTileSize(tileSize, tileSize); product.setNumResolutionsMax(5); Band inputBand1 = product.addBand("input_band_1", "X * X - Y * Y", ProductData.TYPE_FLOAT64); Band inputBand2 = product.addBand("input_band_2", "2 * X * Y", ProductData.TYPE_FLOAT64); Band outputBand = product.addBand("output_band", ProductData.TYPE_FLOAT64); final MultiLevelModel multiLevelModel = ImageManager.getMultiLevelModel(inputBand1); final MultiLevelSource multiLevelSource = new AbstractMultiLevelSource(multiLevelModel) { @Override public void reset() { super.reset(); outputBand.fireProductNodeDataChanged(); } @Override public RenderedImage createImage(int level) { return new RasterDataNodeOpImage(outputBand, ResolutionLevel.create(getModel(), level)) { @Override protected void computeProductData(ProductData outputData, Rectangle region) throws IOException { int numElems = region.width * region.height; ProductData inputData1 = ProductData.createInstance(ProductData.TYPE_FLOAT64, numElems); ProductData inputData2 = ProductData.createInstance(ProductData.TYPE_FLOAT64, numElems); inputBand1.readRasterData(region.x, region.y, region.width, region.height, inputData1); inputBand2.readRasterData(region.x, region.y, region.width, region.height, inputData2); for (int i = 0; i < numElems; i++) { double value1 = inputData1.getElemDoubleAt(i); double value2 = inputData2.getElemDoubleAt(i); outputData.setElemDoubleAt(i, value1 - value2); } } }; } }; outputBand.setSourceImage(new DefaultMultiLevelImage(multiLevelSource));