Revision: 6679 http://sourceforge.net/p/jump-pilot/code/6679 Author: ma15569 Date: 2021-12-02 14:05:38 +0000 (Thu, 02 Dec 2021) Log Message: ----------- Test class to import JPG. GIF, PNG, BMP and JPG2000 (some) as RasterImageLayes. It is build using TifUtilsV2 as sample
Added Paths: ----------- core/trunk/src/org/openjump/core/rasterimage/GeoRasterUtils.java Added: core/trunk/src/org/openjump/core/rasterimage/GeoRasterUtils.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/GeoRasterUtils.java (rev 0) +++ core/trunk/src/org/openjump/core/rasterimage/GeoRasterUtils.java 2021-12-02 14:05:38 UTC (rev 6679) @@ -0,0 +1,129 @@ +package org.openjump.core.rasterimage; + +import java.awt.Dimension; +import java.awt.Point; +import java.awt.geom.NoninvertibleTransformException; +import java.awt.image.DataBuffer; +import java.awt.image.RenderedImage; +import java.awt.image.renderable.ParameterBlock; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.net.URI; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.WeakHashMap; + +import javax.media.jai.JAI; +import javax.media.jai.RenderedOp; + +import org.apache.commons.imaging.ImageReadException; + +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jump.workbench.imagery.geoimg.GeoRaster; +import com.vividsolutions.jump.workbench.imagery.graphic.WorldFile; + +public class GeoRasterUtils { + + public static RenderedOp getRenderedOp(File rasterFile) throws IOException { + final GeoRaster geoRaster = getGeoRaster(rasterFile); + RenderedOp rop; + try { + rop = geoRaster.getRenderedOp(); + } catch (final Exception e) { + // [Giuseppe Aruta 2021-11-15] the previous RenderedOp is generated by a method + // of + // GeoRaster. This class uses the method JAI.create("ImageRead"...) which is not + // optimized for JPG2000 raster files. The method JAI.create("fileload"...) + // is based on JAI plus the Image I/O that provides more codecs, included + // JPG2000 + rop = JAI.create("fileload", rasterFile.toPath()); + throw new IOException(e); + } + return rop; + } + + public static Envelope getEnvelope(File rasterFile) throws ImageReadException, IOException, FileNotFoundException { + Point imageDimensions; + try { + final Dimension dimension = org.apache.commons.imaging.Imaging.getImageSize(rasterFile); + imageDimensions = new Point((int) dimension.getWidth(), (int) dimension.getHeight()); + } catch (final ImageReadException e) { + final RenderedOp op = getRenderedOp(rasterFile); + imageDimensions = new Point(op.getWidth(), op.getHeight()); + } + final Path path = Paths.get(rasterFile.getAbsolutePath()); + final URI uri = path.toUri(); + final WorldFile wf = WorldFile.create(uri.toString()); + double xm, xM, ym, yM; + xm = wf.getXUpperLeft() + wf.getXSize() * (-0.5); + xM = wf.getXUpperLeft() + wf.getXSize() * (-0.5 + imageDimensions.x); + ym = wf.getYUpperLeft() + wf.getYSize() * (-0.5); + yM = wf.getYUpperLeft() + wf.getYSize() * (-0.5 + imageDimensions.y); + return new Envelope(xm, xM, ym, yM); + } + + public static ImageAndMetadata readImageAndMetadata(File rasterFile, Stats stats) + throws NoninvertibleTransformException, IOException, FileNotFoundException, Exception { + final RenderedOp renderOp = getRenderedOp(rasterFile); + final Envelope envelope = getEnvelope(rasterFile); + final int nCols = renderOp.getWidth(); + final int nRows = renderOp.getHeight(); + if (stats == null) { + ParameterBlock pb = new ParameterBlock(); + pb.addSource(renderOp); // The source image + pb.add(null); // null ROI means whole image + pb.add(1); // check every pixel horizontally + pb.add(1); // check every pixel vertically + // Mean + final RenderedImage meanImage = JAI.create("mean", pb, null); + final double[] mean = (double[]) meanImage.getProperty("mean"); + final int nBands = renderOp.getData().getNumBands(); + final long nCells = nCols * nRows; + // StdDev + final double[] stdDev = new double[nBands]; + final DataBuffer dataBuffer = renderOp.getData().getDataBuffer(); + for (int r = 0; r < nRows; r++) { + for (int c = 0; c < nCols; c++) { + for (int b = 0; b < nBands; b++) { + final double val = Math.pow(dataBuffer.getElemDouble(b) - mean[b], 2); + stdDev[b] += val; + } + } + } + for (int b = 0; b < nBands; b++) { + stdDev[b] = Math.sqrt(stdDev[b] / nCells); + } + // Max and min + pb = new ParameterBlock(); + pb.addSource(renderOp); + final RenderedOp op = JAI.create("extrema", pb); + final double[][] extrema = (double[][]) op.getProperty("extrema"); + stats = new Stats(nBands); + for (int b = 0; b < nBands; b++) { + stats.setStatsForBand(b, extrema[0][b], extrema[1][b], mean[b], stdDev[b]); + } + } + final double cellSize = (envelope.getMaxX() - envelope.getMinX()) / renderOp.getWidth(); + return new ImageAndMetadata(renderOp.getAsBufferedImage(), new Metadata(envelope, envelope, + new Point(nCols, nRows), new Point(nCols, nRows), cellSize, cellSize, Double.NaN, stats)); + } + + private static GeoRaster getGeoRaster(File rasterFile) throws IOException { + // prevent recreating inputs by reusing cached RenderedOp + if (geoRasterCache.containsKey(rasterFile)) { + return geoRasterCache.get(rasterFile); + } + final GeoRaster geoRaster = new GeoRaster(rasterFile.toString()); + geoRasterCache.put(rasterFile, geoRaster); + return geoRaster; + } + + // a File -> RenderedOp cache mapping to prevent recreating inputs for the same + // file + private static WeakHashMap<File, GeoRaster> geoRasterCache = new WeakHashMap<>(); + + public static void removeFromGeoRastercache(File rasterFile) { + geoRasterCache.remove(rasterFile); + } +} \ No newline at end of file Property changes on: core/trunk/src/org/openjump/core/rasterimage/GeoRasterUtils.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel