/** * Test transparency is preserved when applying an RGB ChannelSelect and ContrastEnhancement * style to an imageMosaic with Transparent Footprint setting. */ @Test public void testTransparentFootprintWithContrastEnhancementInChannelSelect() throws IOException, NoSuchAuthorityCodeException, FactoryException { File mosaicDirectory = prepareDirectory("footprintCECS"); GridCoverage2D gc = readCoverage(mosaicDirectory, FootprintBehavior.Transparent, null); RenderedImage ri = gc.getRenderedImage(); RenderedOp extrema = ExtremaDescriptor.create(ri, null, 1, 1, false, 1, null); double[] minimum = (double[]) extrema.getProperty("minimum"); double[] maximum = (double[]) extrema.getProperty("maximum"); // read values, not stretched, alpha is present assertArrayEquals(new double[] {0, 0, 0, 0}, minimum, 1E-6); assertArrayEquals(new double[] {54, 54, 54, 255}, maximum, 1E-6); GridCoverage2D output = (GridCoverage2D) symbolizeRaster(gc, "ce_cs.sld"); ri = output.getRenderedImage(); // Assert the alpha band has been preserved, even with a CS+CE SLD in place assertHasAlpha(ri); extrema = ExtremaDescriptor.create(ri, null, 1, 1, false, 1, null); minimum = (double[]) extrema.getProperty("minimum"); maximum = (double[]) extrema.getProperty("maximum"); // values are stretched assertArrayEquals(new double[] {0, 0, 0, 0}, minimum, 1E-6); assertArrayEquals(new double[] {255, 255, 255, 255}, maximum, 1E-6); disposeCoverage(output); ImageUtilities.disposePlanarImageChain(extrema); }
ExtremaDescriptor.create(ri, null, 1, 1, false, 1, renderingHints); double[][] extrema = (double[][]) extremaOp.getProperty("Extrema"); double[] mins = extrema[0];
/** * Test transparency is preserved when applying an RGB ChannelSelect and ContrastEnhancement * style to an imageMosaic with transparent color being set */ @Test public void testTransparentColorWithContrastEnhancementInChannelSelect() throws IOException, NoSuchAuthorityCodeException, FactoryException { File mosaicDirectory = prepareDirectory("transparentCECS"); GridCoverage2D gc = readCoverage(mosaicDirectory, FootprintBehavior.None, Color.BLACK); RenderedImage ri = gc.getRenderedImage(); RenderedOp extrema = ExtremaDescriptor.create(ri, null, 1, 1, false, 1, null); double[] minimum = (double[]) extrema.getProperty("minimum"); double[] maximum = (double[]) extrema.getProperty("maximum"); // read values, not stretched, alpha is present assertArrayEquals(new double[] {0, 0, 0, 0}, minimum, 1E-6); assertArrayEquals(new double[] {54, 54, 54, 255}, maximum, 1E-6); GridCoverage2D output = (GridCoverage2D) symbolizeRaster(gc, "ce_cs.sld"); ri = output.getRenderedImage(); // Assert the alpha band has been preserved, even with a CS+CE SLD in place assertHasAlpha(ri); extrema = ExtremaDescriptor.create(ri, null, 1, 1, false, 1, null); minimum = (double[]) extrema.getProperty("minimum"); maximum = (double[]) extrema.getProperty("maximum"); // values are stretched assertArrayEquals(new double[] {0, 0, 0, 0}, minimum, 1E-6); assertArrayEquals(new double[] {255, 255, 255, 255}, maximum, 1E-6); disposeCoverage(output); ImageUtilities.disposePlanarImageChain(extrema); }
public static BufferedImage applyContrast(BufferedImage inputImage) { final BufferedImage extrema = ExtremaDescriptor.create(inputImage, null, 1, 1, false, 1, null).getAsBufferedImage(); double[][] minMax = (double[][]) extrema.getProperty("Extrema"); double min = minMax[0][0]; double max = minMax[1][0]; double dif = max - min; return rescale(1.0 / (max - min), min / (max - min), inputImage); }
private Double[][] getExtrema(RenderedImage image) { RenderedOp extremaOp = ExtremaDescriptor.create(image, null, 1, 1, false, 1, null); double[][] extrema= (double[][]) extremaOp.getProperty("extrema"); Double[][] result = new Double[2][]; result[0] = new Double[] {extrema[0][0]}; result[1] = new Double[] {extrema[1][0]}; return result; } }
/** * Returns the minimums and maximums values found in the image. Those extremas are * returned as an array of the form {@code double[2][#bands]}. */ private double[][] getExtremas() { Object extrema = getComputedProperty(EXTREMA); if (!(extrema instanceof double[][])) { final Integer ONE = new Integer(1); image = ExtremaDescriptor.create( image, // The source image. roi, // The region of the image to scan. Default to all. ONE, // The horizontal sampling rate. Default to 1. ONE, // The vertical sampling rate. Default to 1. null, // Whether to store extrema locations. Default to false. ONE, // Maximum number of run length codes to store. Default to 1. getRenderingHints()); extrema = getComputedProperty(EXTREMA); } return (double[][]) extrema; }
/** * Returns the minimums and maximums values found in the image. Those extremas are * returned as an array of the form {@code double[2][#bands]}. */ private double[][] getExtremas() { Object extrema = getComputedProperty(EXTREMA); if (!(extrema instanceof double[][])) { final Integer ONE = 1; image = ExtremaDescriptor.create( image, // The source image. roi, // The region of the image to scan. Default to all. ONE, // The horizontal sampling rate. Default to 1. ONE, // The vertical sampling rate. Default to 1. null, // Whether to store extrema locations. Default to false. ONE, // Maximum number of run length codes to store. Default to 1. getRenderingHints()); extrema = getComputedProperty(EXTREMA); } return (double[][]) extrema; }
/** * Returns true if the best format to encode the image is jpeg (the image is rgb, or rgba * without any actual transparency use) * * @param renderedImage * @param renderingHints * @return */ private boolean isBestFormatJpeg(RenderedImage renderedImage) { int numBands = renderedImage.getSampleModel().getNumBands(); if (numBands == 4 || numBands == 2) { RenderingHints renderingHints = ImageUtilities.getRenderingHints(renderedImage); RenderedOp extremaOp = ExtremaDescriptor.create(renderedImage, null, 1, 1, false, 1, renderingHints); double[][] extrema = (double[][]) extremaOp.getProperty("Extrema"); double[] mins = extrema[0]; return mins[mins.length - 1] == 255; // fully opaque } else if (renderedImage.getColorModel() instanceof IndexColorModel) { // JPEG would still compress a bit better, but in order to figure out // if the image has transparency we'd have to expand to RGB or roll // a new JAI image op that looks for the transparent pixels. Out of scope for the moment return false; } else { // otherwise support RGB or gray return (numBands == 3) || (numBands == 1); } }
void assertImagesEqual(final RenderedImage image1, final RenderedImage image2) { // Preliminar checks on image properties assertEquals(image1.getWidth(), image2.getWidth()); assertEquals(image1.getHeight(), image2.getHeight()); // pixel by pixel difference check RenderedImage int1 = FormatDescriptor.create(image1, DataBuffer.TYPE_SHORT, null); RenderedImage int2 = FormatDescriptor.create(image2, DataBuffer.TYPE_SHORT, null); RenderedImage diff = SubtractDescriptor.create(int1, int2, null); RenderedImage extremaImg = ExtremaDescriptor.create(diff, null, 1, 1, false, Integer.MAX_VALUE, null); double[][] extrema = (double[][]) extremaImg.getProperty("extrema"); for (int band = 0; band < extrema.length; band++) { assertEquals("Minimum should be 0", 0d, extrema[0][band], 1e-9); assertEquals("Maximum should be 0", 0d, extrema[1][band], 1e-9); } }
if (numBands == 4 || numBands == 2) { RenderedOp extremaOp = ExtremaDescriptor.create( renderedImage, null,
private double[][] computeExtrema(RenderedImage image1, RenderedImage image2) { RenderedImage int1 = FormatDescriptor.create(image1, DataBuffer.TYPE_SHORT, null); RenderedImage int2 = FormatDescriptor.create(image2, DataBuffer.TYPE_SHORT, null); RenderedImage diff = SubtractDescriptor.create(int1, int2, null); RenderedImage extremaImg = ExtremaDescriptor.create(diff, null, 1, 1, false, Integer.MAX_VALUE, null); double[][] extrema = (double[][]) extremaImg.getProperty("extrema"); return extrema; }
final RenderedOp statistics = ExtremaDescriptor.create(inputImage, null, Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1), null);
xPeriod, yPeriod, null); } else if (STATISTIC == 1) { imageStats = javax.media.jai.operator.ExtremaDescriptor.create(testImage, roi, xPeriod, yPeriod, false, 1, null); } else if (STATISTIC == 2) {
final RenderedOp image = ExtremaDescriptor.create(inputImage, null, Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1), null); final RenderedOp statistics = ExtremaDescriptor.create(inputImage, null, Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1), null); final RenderedOp statistics = ExtremaDescriptor.create(inputImage, null, Integer.valueOf(1), Integer.valueOf(1), null, Integer.valueOf(1), null);