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

Reply via email to