Revision: 6503 http://sourceforge.net/p/jump-pilot/code/6503 Author: edso Date: 2020-09-20 22:17:08 +0000 (Sun, 20 Sep 2020) Log Message: ----------- created TiffUtilsV2, basically a caching static wrapper for GeoReferencedImage general speedup because of reusing the established image source replaced all TIF JAI.create("ImageRead", ...) with TiffUtilsV2.getRenderedOp() added TiffUtilsV2.getEnvelope() to retrieve georeferencing from one point added some logging
TODO: port TiffUtils.readImage() and others over to TiffUtilsV2 especially the two readImage() methods can possibly be simplified a lot reusing GeoReferencedImage functionality Modified Paths: -------------- core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java Added Paths: ----------- core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java Modified: core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java 2020-09-20 21:39:16 UTC (rev 6502) +++ core/trunk/src/org/openjump/core/rasterimage/OverviewsUtils.java 2020-09-20 22:17:08 UTC (rev 6503) @@ -91,10 +91,11 @@ */ public static void createOverviews(File tiffFile, int overviewsCount) throws IOException { - ParameterBlock pbjRead = new ParameterBlock(); - pbjRead.add(ImageIO.createImageInputStream(tiffFile)); - RenderedOp originalImage = JAI.create("ImageRead", pbjRead, null); +// ParameterBlock pbjRead = new ParameterBlock(); +// pbjRead.add(ImageIO.createImageInputStream(tiffFile)); +// RenderedOp originalImage = JAI.create("ImageRead", pbjRead, null); + RenderedOp originalImage = TiffUtilsV2.getRenderedOp(tiffFile); OutputStream out = new FileOutputStream(new File(tiffFile.getParent(), tiffFile.getName() + ".ovr")); Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java 2020-09-20 21:39:16 UTC (rev 6502) +++ core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java 2020-09-20 22:17:08 UTC (rev 6503) @@ -126,26 +126,29 @@ new Point(bImage.getWidth(), bImage.getHeight()), cellSize, cellSize, Double.NaN, stats)); - } else if (fileNameOrURL.toLowerCase().endsWith(".tif") - || fileNameOrURL.toLowerCase().endsWith(".tiff")) { + } else if (fileNameOrURL.toLowerCase().endsWith(".tif") || fileNameOrURL.toLowerCase().endsWith(".tiff")) { - TiffMetadata tiffMetadata = TiffTags.readMetadata(new File( - fileNameOrURL)); + File tiffFile = new File(fileNameOrURL); - int imgWidth = tiffMetadata.getColsCount(); - int imgHeight = tiffMetadata.getRowsCount(); +// TiffMetadata tiffMetadata = TiffTags.readMetadata(new File( +// fileNameOrURL)); +// +// int imgWidth = tiffMetadata.getColsCount(); +// int imgHeight = tiffMetadata.getRowsCount(); +// +// Envelope imageEnvelope = tiffMetadata.getEnvelope(); + // Envelope imageEnvelope = getGeoReferencing(fileNameOrURL, true, + // new Point(imgWidth, imgHeight)); - Envelope imageEnvelope = tiffMetadata.getEnvelope(); - // Envelope imageEnvelope = getGeoReferencing(fileNameOrURL, true, - // new Point(imgWidth, imgHeight)); +// Overviews overviews = OverviewsUtils.getOverviews(new File( +// fileNameOrURL), imageEnvelope); - Overviews overviews = OverviewsUtils.getOverviews(new File( - fileNameOrURL), imageEnvelope); + Envelope imageEnvelope = TiffUtilsV2.getEnvelope(tiffFile); + Overviews overviews = OverviewsUtils.getOverviews(new File(fileNameOrURL), imageEnvelope); - return TiffUtils.readImage(new File(fileNameOrURL), - viewPortEnvelope, requestedRes, overviews, stats); + return TiffUtils.readImage(tiffFile, viewPortEnvelope, requestedRes, overviews, stats); - } else if (fileNameOrURL.toLowerCase().endsWith(".flt")) { + } else if (fileNameOrURL.toLowerCase().endsWith(".flt")) { GridFloat gf = new GridFloat(fileNameOrURL); gf.readGrid(null); @@ -202,16 +205,19 @@ } else if (filenameOrURL.toLowerCase().endsWith(".tif") || filenameOrURL.toLowerCase().endsWith(".tiff")) { - GeoReferencedRaster geoRaster; - RenderedOp renderedOp; - try { - geoRaster = new GeoReferencedRaster(new File(filenameOrURL).toURI().toString()); - renderedOp = geoRaster.getImage(); - } catch (ReferencedImageException e) { - // TODO Auto-generated catch block - renderedOp = JAI.create("fileload", filenameOrURL); - } - return renderedOp.getAsBufferedImage(subset, null).getData(); +// GeoReferencedRaster geoRaster; +// RenderedOp renderedOp; +// try { +// geoRaster = new GeoReferencedRaster(new File(filenameOrURL).toURI().toString()); +// renderedOp = geoRaster.getImage(); +// } catch (ReferencedImageException e) { +// // TODO Auto-generated catch block +// renderedOp = JAI.create("fileload", filenameOrURL); +// } +// return renderedOp.getAsBufferedImage(subset, null).getData(); + + return TiffUtilsV2.getRenderedOp(new File(filenameOrURL)).getAsBufferedImage(subset, null).getData(); + } else if (filenameOrURL.toLowerCase().endsWith(".jpg") || filenameOrURL.toLowerCase().endsWith(".bmp") || filenameOrURL.toLowerCase().endsWith(".jp2")) { @@ -327,7 +333,7 @@ } else if (filenameOrURL.toLowerCase().endsWith(".tif") || filenameOrURL.toLowerCase().endsWith(".tiff")) { - renderedOp= TiffUtils.getRenderedOp(new File(filenameOrURL)); + renderedOp= TiffUtilsV2.getRenderedOp(new File(filenameOrURL)); return renderedOp.getData(rectangle) .getSampleDouble(col, row, band); @@ -386,7 +392,7 @@ }else if (filenameOrURL.toLowerCase().endsWith(".tif") || filenameOrURL.toLowerCase().endsWith(".tiff")) { RenderedOp renderedOp; - renderedOp= TiffUtils.getRenderedOp(new File(filenameOrURL)); + renderedOp= TiffUtilsV2.getRenderedOp(new File(filenameOrURL)); if (renderedOp != null) { return new Point(renderedOp.getWidth(), renderedOp.getHeight()); Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java 2020-09-20 21:39:16 UTC (rev 6502) +++ core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java 2020-09-20 22:17:08 UTC (rev 6503) @@ -546,6 +546,7 @@ Resolution requestedRes = RasterImageIO.calcRequestedResolution(viewport); long start = Timer.milliSecondsSince(0); + Logger.debug("Try reading "+getName()); ImageAndMetadata imageAndMetadata = rasterImageIO.loadImage(getWorkbenchContext(), imageFileName, stats, viewport.getEnvelopeInModelCoordinates(), requestedRes); Logger.info("Reading '"+getName()+"' took "+Timer.secondsSinceString(start)+"s."); metadata = imageAndMetadata.getMetadata(); Modified: core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java 2020-09-20 21:39:16 UTC (rev 6502) +++ core/trunk/src/org/openjump/core/rasterimage/TiffUtils.java 2020-09-20 22:17:08 UTC (rev 6503) @@ -32,7 +32,6 @@ import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jump.workbench.Logger; -import com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster; /** * @@ -81,7 +80,7 @@ xScale = Math.min(xScale, 1); yScale = Math.min(yScale, 1); - RenderedOp renderedOp = readSubsampled(tiffFile, xScale, yScale); + RenderedOp renderedOp = TiffUtilsV2.readSubsampled(tiffFile, xScale, yScale); // For better looking results, but slower: // rop = JAI.create("SubsampleAverage", pb); @@ -242,7 +241,7 @@ throws ParserConfigurationException, TransformerException, TransformerConfigurationException, SAXException, IOException { - BufferedImage bufferedImage = readSubsampled(tiffFile, 1, 1).getAsBufferedImage(); + BufferedImage bufferedImage = TiffUtilsV2.readSubsampled(tiffFile, 1, 1).getAsBufferedImage(); int bandCount = bufferedImage.getRaster().getNumBands(); double minValue[] = new double[bandCount]; @@ -314,63 +313,9 @@ } - /* - * public static RenderedOp readSubsampled(File tiffFile, float xScale, float - * yScale) { System.setProperty("com.sun.media.jai.disableMediaLib", "true"); - * RenderedOp renderedOp = JAI.create("fileload", tiffFile.getAbsolutePath()); - * ParameterBlock parameterBlock = new ParameterBlock(); - * parameterBlock.addSource(renderedOp); parameterBlock.add(xScale); - * parameterBlock.add(yScale); return JAI.create("scale", parameterBlock); - * - * } - */ - - // [Giuseppe Aruta 2020-07-09] whenever it is possible - // we use JAI Image I/O - - public static RenderedOp readSubsampled(File tiffFile, float xScale, float yScale) { - RenderedOp renderedOp = getRenderedOp(tiffFile); - ParameterBlock parameterBlock = new ParameterBlock(); - parameterBlock.addSource(renderedOp); - parameterBlock.add(xScale); - parameterBlock.add(yScale); - renderedOp = JAI.create("scale", parameterBlock); - return JAI.create("scale", parameterBlock); - - } - - public static Double readCellValue(File tiffFile, int col, int row, int band) { - + public static Double readCellValue(File tiffFile, int col, int row, int band) throws Exception { Rectangle rectangle = new Rectangle(col, row, 1, 1); - return getRenderedOp(tiffFile).getData(rectangle).getSampleDouble(col, row, band); + return TiffUtilsV2.getRenderedOp(tiffFile).getData(rectangle).getSampleDouble(col, row, band); } - public static RenderedOp getRenderedOp(File tiffFile) { - // Since JAI error messages are rerouted to OJ log - // I suppress the error message for absence of mediaLib accelerator - System.setProperty("com.sun.media.jai.disableMediaLib", "true"); - RenderedOp renderedOp = null; - try { - // First try with JAI Image I/O "ImageRead" - GeoReferencedRaster geoRaster = new GeoReferencedRaster(tiffFile.toURI().toString(), - new com.github.jaiimageio.impl.plugins.tiff.TIFFImageReaderSpi()); - renderedOp = geoRaster.getImage(); - } catch (Exception e) { - // Then with JAI "FileLoad" - // System.setProperty("com.sun.media.jai.disableMediaLib", "true"); - - // <GeoRaster.class> rerouted JAI error messages to OJ log here - JAI.getDefaultInstance().setImagingListener(new ImagingListener() { - @Override - public boolean errorOccurred(String msg, Throwable thrown, Object where, boolean isRetryable) - throws RuntimeException { - Logger.error(thrown); - return false; - } - }); - renderedOp = JAI.create("fileload", tiffFile.toURI().toString()); - } - return renderedOp; - } - } Added: core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java =================================================================== --- core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java (rev 0) +++ core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java 2020-09-20 22:17:08 UTC (rev 6503) @@ -0,0 +1,69 @@ +package org.openjump.core.rasterimage; + +import java.awt.image.renderable.ParameterBlock; +import java.io.File; +import java.io.IOException; +import java.util.HashMap; + +import javax.media.jai.JAI; +import javax.media.jai.RenderedOp; + +import com.vividsolutions.jts.geom.Envelope; +import com.vividsolutions.jump.workbench.imagery.ReferencedImageException; +import com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster; + +public class TiffUtilsV2 { + // a File -> RenderedOp cache mapping to prevent recreating inputs for the same file + private static HashMap<File,GeoReferencedRaster> geoRasterCache = new HashMap<File,GeoReferencedRaster>(); + + + public static RenderedOp getRenderedOp(File tiffFile) throws IOException { + GeoReferencedRaster geoRaster = getGeoReferencedRaster(tiffFile); + RenderedOp rop; + try { + rop = geoRaster.getImage(); + } catch (ReferencedImageException e) { + // TODO: handle errors better, wrapping it in IOException here + // because that's what's handled up from here + throw new IOException(e); + } + return rop; + } + + public static Envelope getEnvelope(File tiffFile) throws IOException { + GeoReferencedRaster geoRaster = getGeoReferencedRaster(tiffFile); + + return geoRaster.getOriginalEnvelope(); + } + + private static GeoReferencedRaster getGeoReferencedRaster(File tiffFile) throws IOException { + // prevent recreating inputs by reusing cached RenderedOp + if (geoRasterCache.containsKey(tiffFile)) + return geoRasterCache.get(tiffFile); + + GeoReferencedRaster geoRaster; + try { + geoRaster = new GeoReferencedRaster(tiffFile.toString(), + new com.github.jaiimageio.impl.plugins.tiff.TIFFImageReaderSpi()); + } catch (ReferencedImageException e) { + // TODO: handle errors better, wrapping it in IOException here + // because that's what's handled up from here + throw new IOException(e); + } + + // save in cache + geoRasterCache.put(tiffFile, geoRaster); + + return geoRaster; + } + + public static RenderedOp readSubsampled(File tiffFile, float xScale, float yScale) throws IOException { + RenderedOp renderedOp = getRenderedOp(tiffFile); + ParameterBlock parameterBlock = new ParameterBlock(); + parameterBlock.addSource(renderedOp); + parameterBlock.add(xScale); + parameterBlock.add(yScale); + renderedOp = JAI.create("scale", parameterBlock); + return JAI.create("scale", parameterBlock); + } +} Property changes on: core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Modified: core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java =================================================================== --- core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java 2020-09-20 21:39:16 UTC (rev 6502) +++ core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java 2020-09-20 22:17:08 UTC (rev 6503) @@ -58,6 +58,7 @@ import com.vividsolutions.jump.feature.FeatureCollection; import com.vividsolutions.jump.feature.FeatureDataset; import com.vividsolutions.jump.feature.FeatureSchema; +import com.vividsolutions.jump.workbench.Logger; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.model.Layerable; @@ -334,11 +335,12 @@ } } catch (RasterDataNotFoundException ex) { - cellValues = "???"; + cellValues = "???"; } catch (IOException e) { - cellValues = " - "; + cellValues = " - "; + Logger.error(e); } catch (NoninvertibleTransformException e) { - cellValues = " - "; + cellValues = " - "; } name = ((RasterImageLayer) layer).getName(); getPanel().getContext().setStatusMessage( @@ -346,7 +348,7 @@ + cellValues.toString());} } } - + @Override public String getName() { return I18N.get("org.openjump.core.ui.plugin.raster.RasterQueryPlugIn"); _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel