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
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel