/** * The BandMerge operation takes indexed images and expands them, however in the context of * coverage view band merging we don't normally want that, e.g., raster mask bands are * represented as indexed but we really want to keep them in their binary, single band form. To * do so, the IndexColorModel is replaced by a ComponentColorModel * * @param coverage * @return */ private GridCoverage2D prepareForBandMerge(GridCoverage2D coverage) { RenderedImage ri = coverage.getRenderedImage(); SampleModel sampleModel = ri.getSampleModel(); if (sampleModel.getNumBands() == 1 && ri.getColorModel() instanceof IndexColorModel) { ImageWorker worker = new ImageWorker(ri); worker.removeIndexColorModel(); RenderedImage formatted = worker.getRenderedImage(); return new GridCoverageFactory() .create( coverage.getName(), formatted, coverage.getGridGeometry(), coverage.getSampleDimensions(), new GridCoverage[] {coverage}, coverage.getProperties()); } return coverage; }
throws ServiceException, IOException { PrintStream ps = new PrintStream(output); ps.println("Grid bounds: " + coverage.getEnvelope()); ps.println("Grid CRS: " + coverage.getCoordinateReferenceSystem()); ps.println("Grid range: " + coverage.getGridGeometry().getGridRange()); ps.println("Grid to world: " + coverage.getGridGeometry().getGridToCRS()); ps.println("Contents:"); RenderedImage ri = coverage.getRenderedImage(); Raster raster = ri.getData(); for (int band = 0; band < raster.getNumBands(); band++) { ps.println("Band " + band + ":"); for (int j = raster.getMinY(); j < (raster.getMinY() + raster.getHeight()); j++) { for (int i = raster.getMinX(); i < (raster.getMinX() + raster.getWidth()); i++) { if (raster.getTransferType() == DataBuffer.TYPE_DOUBLE)
public void drawRenderedImage(RenderedImage renderedimage, AffineTransform affinetransform) { BufferedImage bufferedimage = new BufferedImage(renderedimage.getColorModel(), renderedimage.getData().createCompatibleWritableRaster(), false, null); bufferedimage.setData(renderedimage.getData()); drawImage(bufferedimage, affinetransform, null); }
requestedGridGeometry = (GridGeometry2D) value.getValue(); ReferencedEnvelope requestedEnvelope = ReferencedEnvelope.reference(requestedGridGeometry.getEnvelope()); ReferencedEnvelope dataEnvelope = ReferencedEnvelope.reference(handler.getOriginalEnvelope()); GridEnvelope2D range = requestedGridGeometry.getGridRange2D(); GridEnvelope2D expandedRange = new GridEnvelope2D( GridCoverage2D reference = inputCoverages.values().stream().filter(c -> c != null).findFirst().get(); RenderedImage ri = reference.getRenderedImage(); width = ri.getWidth(); height = ri.getHeight(); height, bandValues, new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout)); + coverageName + ", result has envelope " + coverage.getEnvelope2D());
if (raster.getColorModel() instanceof IndexColorModel && expandToRGB) { raster = new ImageWorker(raster).forceComponentColorModel().getRenderedImage(); ColorModel colorModel = raster.getColorModel(); if (colorModel == null) { ImageLayout layout = (ImageLayout) hints.get(JAI.KEY_IMAGE_LAYOUT); if (layout == null) { layout = new ImageLayout(); ImageIOUtilities.createColorModel(raster.getSampleModel()); if (newColorModel != null) { layout.setColorModel(newColorModel); .format(raster.getSampleModel().getDataType()) double decimationScaleX = ((1.0 * sourceArea.width) / raster.getWidth()); double decimationScaleY = ((1.0 * sourceArea.height) / raster.getHeight()); final AffineTransform decimationScaleTranform = XAffineTransform.getScaleInstance(decimationScaleX, decimationScaleY); raster.getMinX(), raster.getMinY(), raster.getWidth(), raster.getHeight()); Object roi = renderedImage.getProperty("ROI"); if (useFootprint && (roi instanceof ROIGeometry
@Test public void testZoomlevel3() throws IOException { MBTilesReader reader = new MBTilesReader(getClass().getResource("world_lakes.mbtiles"), null); GeneralParameterValue[] parameters = new GeneralParameterValue[1]; GridGeometry2D gg = new GridGeometry2D( new GridEnvelope2D(new Rectangle(500, 500)), new ReferencedEnvelope(0, 90.0, -85.0, 0, MBTilesReader.WGS_84)); parameters[0] = new Parameter<GridGeometry2D>(AbstractGridFormat.READ_GRIDGEOMETRY2D, gg); GridCoverage2D gc = reader.read(parameters); RenderedImage img = gc.getRenderedImage(); assertEquals(0, gc.getEnvelope().getMinimum(0), 0.01); assertEquals(-20037508.34, gc.getEnvelope().getMinimum(1), 0.01); assertEquals(15028131.25, gc.getEnvelope().getMaximum(0), 0.01); assertEquals(0, gc.getEnvelope().getMaximum(1), 0.01); assertEquals(768, img.getWidth()); assertEquals(1024, img.getHeight()); }
/** * A wrapper for {@link #setImage(int, int, ByteBuffer, Rectangle, int)}. * * @param image a rendered image * @param rect region of interest * @throws java.io.IOException */ protected void setImage(RenderedImage image, Rectangle rect) throws IOException { ByteBuffer buff = ImageIOHelper.getImageByteBuffer(image); int bpp; DataBuffer dbuff = image.getData(new Rectangle(1,1)).getDataBuffer(); if (dbuff instanceof DataBufferByte) { bpp = image.getColorModel().getPixelSize(); } else { bpp = 8; // BufferedImage.TYPE_BYTE_GRAY image } setImage(image.getWidth(), image.getHeight(), buff, rect, bpp); }
DefaultGeographicCRS.WGS84, mapExtent, new Rectangle(0, 0, 100, 100), null); 256, 256); assertEquals(1, image.getSampleModel().getNumBands()); assertEquals(255, new ImageWorker(image).getMinimums()[0], 0d);
this.frame = frame; this.displayImage = displayImg; this.imageBounds = new Rectangle(displayImage.getMinX(), displayImage.getMinY(), displayImage.getWidth(), displayImage.getHeight()); switch (dataImage.getSampleModel().getDataType()) { case DataBuffer.TYPE_BYTE: case DataBuffer.TYPE_SHORT: case DataBuffer.TYPE_INT: integralImageDataType = true; intData = new int[dataImage.getSampleModel().getNumBands()]; break; case DataBuffer.TYPE_DOUBLE: integralImageDataType = false; doubleData = new double[dataImage.getSampleModel().getNumBands()]; break;
final ImageWorker imageWorker = new ImageWorker(mosaic); hints = prepareHints(hints); imageWorker.setRenderingHints(hints); if (!imageWorker.isColorSpaceGRAYScale()) { if (!imageWorker.isColorSpaceRGB()) { imageWorker.forceColorSpaceRGB(); if (imageWorker.getRenderedImage().getColorModel().hasAlpha()) { .getRenderedImage(); imageWorker.retainBands(mosaic.getColorModel().getNumColorComponents()); imageWorker.addBand(maskedAlpha, false, true, null); } else { new ImageLayout( mosaic.getMinX(), mosaic.getMinY(), mosaic.getWidth(), mosaic.getHeight()); final SampleModel sampleModel = mosaic.getSampleModel(); layout.setTileHeight(sampleModel.getWidth()) .setTileWidth(sampleModel.getHeight()); hints.add(new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout));
ColorModel colorModel = image.getColorModel(); index.getPixelSize(), index.getMapSize(), reds, greens, blues, alphas); LookupTable table = buildOpacityLookupTable(0, 1, -1, image.getSampleModel().getDataType()); ImageLayout layout = new ImageLayout(image); layout.setColorModel(newColorModel); RenderingHints hints = new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout); if (!expanded.getColorModel().hasAlpha()) { new ImageLayout( image.getMinX(), image.getMinY(), image.getWidth(), image.getHeight()); RenderedOp alphaBand = ConstantDescriptor.create( (float) image.getWidth(), (float) image.getHeight(), new Byte[] {Byte.valueOf(alpha)}, new RenderingHints(JAI.KEY_IMAGE_LAYOUT, layout)); final int bands = expanded.getSampleModel().getNumBands(); int alphaBand = bands - 1; opacity, bands, alphaBand, expanded.getSampleModel().getDataType()); pb.set(table, 0); pb.set(roi, 2);
public void readRasterBand(final int sourceOffsetX, final int sourceOffsetY, final int sourceStepX, final int sourceStepY, final ProductData destBuffer, final int destOffsetX, final int destOffsetY, final int destWidth, final int destHeight, final int imageID, final ImageIOFile img, final int bandSampleOffset) throws IOException { final Raster data; synchronized (dataDir) { final ImageReader reader = img.getReader(); final ImageReadParam param = reader.getDefaultReadParam(); param.setSourceSubsampling(sourceStepX, sourceStepY, sourceOffsetX % sourceStepX, sourceOffsetY % sourceStepY); final RenderedImage image = reader.readAsRenderedImage(0, param); data = image.getData(new Rectangle(destOffsetX, destOffsetY, destWidth, destHeight)); } final int w = data.getWidth(); final int h = data.getHeight(); final DataBuffer dataBuffer = data.getDataBuffer(); final SampleModel sampleModel = data.getSampleModel(); final int sampleOffset = imageID + bandSampleOffset; sampleModel.getSamples(0, 0, w, h, sampleOffset, (float[]) destBuffer.getElems(), dataBuffer); } }
/** * Test transparency is preserved when applying a ChannelSelect (Gray) style to an imageMosaic * with Transparent Footprint setting. */ @Test public void testTransparentFootprintWithChannelSelectGray() throws IOException, NoSuchAuthorityCodeException, FactoryException { File mosaicDirectory = prepareDirectory("footprintCSGray"); GridCoverage2D gc = readCoverage(mosaicDirectory, FootprintBehavior.Transparent, null); GridCoverage2D output = (GridCoverage2D) symbolizeRaster(gc, "graychannel.sld"); RenderedImage ri = output.getRenderedImage(); // Assert the alpha band has been preserved, even with a ChannelSelect SLD in place ColorModel cm = ri.getColorModel(); assertTrue(cm.hasAlpha()); assertEquals(2, cm.getNumComponents()); // Make sure the topleft pixel is transparent Raster rasterPixel = ri.getData(new Rectangle(0, 0, 1, 1)); assertEquals(0, rasterPixel.getSample(0, 0, 1)); disposeCoverage((GridCoverage2D) output); }
final RenderingHints hints = getRenderingHints(); final ImageLayout layout = getImageLayout(hints); if (layout.isValid(ImageLayout.COLOR_MODEL_MASK)) { return hints; final ColorModel oldCm = image.getColorModel(); if (oldCm != null) { final ColorModel newCm = new ComponentColorModel( oldCm.getColorSpace(), oldCm.hasAlpha(), // If true, supports transparency. oldCm.isAlphaPremultiplied(), // If true, alpha is premultiplied. oldCm.getTransparency(), // What alpha values can be represented. layout.setColorModel(newCm); layout.setSampleModel( newCm.createCompatibleSampleModel(image.getWidth(), image.getHeight())); } else { final int numBands = image.getSampleModel().getNumBands(); final ColorModel newCm = new ComponentColorModel( layout.setColorModel(newCm); layout.setSampleModel( newCm.createCompatibleSampleModel(image.getWidth(), image.getHeight())); hints.put(JAI.KEY_IMAGE_LAYOUT, layout); return hints;
private void applyAndAssertContrastEnhancement(GridCoverage2DReader reader) throws TransformException, NoninvertibleTransformException, FactoryException, IOException { ReferencedEnvelope mapExtent = new ReferencedEnvelope(0, 90, 0, 90, DefaultGeographicCRS.WGS84); GridCoverageRenderer renderer = new GridCoverageRenderer( DefaultGeographicCRS.WGS84, mapExtent, new Rectangle(0, 0, 255, 255), null); int min = 10; int max = 100; RasterSymbolizer symbolizer = createClippingChannelSelectionSymbolizer(min, max); RenderedImage image = renderer.renderImage( reader, null, symbolizer, Interpolation.getInstance(Interpolation.INTERP_NEAREST), Color.BLACK, 256, 256); assertEquals(3, image.getSampleModel().getNumBands()); // Make sure clip occurred even with optimized band selection ImageWorker worker = new ImageWorker(image); double[] maximums = worker.getMaximums(); assertEquals(max, maximums[0], 0d); assertEquals(max + 20, maximums[1], 0d); assertEquals(max + 40, maximums[2], 0d); ImageUtilities.disposeImage(image); }
DefaultGeographicCRS.WGS84, mapExtent, new Rectangle(0, 0, 255, 255), null); assertEquals(3, image.getSampleModel().getNumBands());
final ColorModel sourceColorModel = sourceImage.getColorModel(); final Raster sourceRaster = sourceImage.getTile(tx, ty); final int w = sourceRaster.getWidth(); final int h = sourceRaster.getHeight(); final int numBands = sourceRaster.getSampleModel().getNumBands(); final int[] rgba = new int[numBands]; final boolean sourceHasAlpha = sourceColorModel.hasAlpha(); final int alphaBand = sourceHasAlpha ? numBands - 1 : -1; final int minx = sourceRaster.getMinX(); final WritableRaster destRaster = this.colorModel .createCompatibleWritableRaster(w, h) .createWritableTranslatedChild(minx, miny);
RenderingHints hints = ImageUtilities.getRenderingHints(image); if (hints == null) { hints = new RenderingHints(null); if (commonHints != null) { hints.add(commonHints); hints.putAll(commonHints); if (Boolean.FALSE.equals(hints.get(TILING_ALLOWED))) { final ImageLayout layout = getImageLayout(hints); if (commonHints == null || layout != commonHints.get(JAI.KEY_IMAGE_LAYOUT)) { layout.setTileWidth(image.getWidth()); layout.setTileHeight(image.getHeight()); layout.setTileGridXOffset(image.getMinX()); layout.setTileGridYOffset(image.getMinY()); hints.put(JAI.KEY_IMAGE_LAYOUT, layout);
@Test public void testReprojectGoogleMercator() throws Exception { CoordinateReferenceSystem googleMercator = CRS.decode("EPSG:3857"); ReferencedEnvelope mapExtent = new ReferencedEnvelope( -20037508.34, 20037508.34, -20037508.34, 20037508.34, googleMercator); Rectangle screenSize = new Rectangle(200, (int) (mapExtent.getHeight() / mapExtent.getWidth() * 200)); AffineTransform w2s = RendererUtilities.worldToScreenTransform(mapExtent, screenSize); GridCoverageRenderer renderer = new GridCoverageRenderer(googleMercator, mapExtent, screenSize, w2s); RasterSymbolizer rasterSymbolizer = new StyleBuilder().createRasterSymbolizer(); GridCoverage2D coverage = worldReader.read(null); RenderedImage image = renderer.renderImage( coverage, rasterSymbolizer, Interpolation.getInstance(Interpolation.INTERP_NEAREST), Color.RED, 256, 256); // always set ROI on reprojection assertThat(image.getProperty("roi"), instanceOf(ROI.class)); File reference = new File( "src/test/resources/org/geotools/renderer/lite/gridcoverage2d/googleMercator.png"); ImageAssert.assertEquals(reference, image, 0); }