hey Peppe, ajaics this still leaves
private static ImageAndMetadata readImage(File tiffFile, int overviewIndex, int indexStart, Point originalSize, Resolution originalCellSize, Envelope wholeImageEnvelope, Envelope viewportEnvelope, double noDataValue, Stats stats) throws IOException, NoninvertibleTransformException { ImageInputStream imageInputStream = ImageIO.createImageInputStream(tiffFile); Iterator<ImageReader> iterator = ImageIO.getImageReaders(imageInputStream); which i'd like to see disabled/removed to prevent seeing errors from the wrong reader used. ..ede On 22.09.2020 18:07, jump-pilot-svn--- via Jump-pilot-devel wrote: > Revision: 6518 > http://sourceforge.net/p/jump-pilot/code/6518 > Author: ma15569 > Date: 2020-09-22 16:07:41 +0000 (Tue, 22 Sep 2020) > Log Message: > ----------- > Added a new method to read Image and Metadata for TIF. > It gets rid of using Commons Imaging that sometimes throws exception > on both reading resolution of the image. Metadata are now decoded partially > via loaded GeoRasterImage or by using JAI to read noData value. > Removed code to read overviews. > > Modified Paths: > -------------- > core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java > core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java > > Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java > =================================================================== > --- core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java > 2020-09-22 14:56:54 UTC (rev 6517) > +++ core/trunk/src/org/openjump/core/rasterimage/RasterImageIO.java > 2020-09-22 16:07:41 UTC (rev 6518) > @@ -140,11 +140,14 @@ > // Overviews overviews = OverviewsUtils.getOverviews(new > File( > // fileNameOrURL), imageEnvelope); > > - Envelope imageEnvelope = TiffUtilsV2.getEnvelope(tiffFile); > - Overviews overviews = OverviewsUtils.getOverviews(new > File(fileNameOrURL), imageEnvelope); > + // Envelope imageEnvelope = TiffUtilsV2.getEnvelope(tiffFile); > + // Overviews overviews = OverviewsUtils.getOverviews(new > File(fileNameOrURL), imageEnvelope); > > - return TiffUtilsV2.readImage(tiffFile, viewPortEnvelope, requestedRes, > overviews, stats); > - > + // return TiffUtilsV2.readImage(tiffFile, viewPortEnvelope, > requestedRes, overviews, stats); > + > + // [Giuseppe Aruta 2020-sept-22] added new method that remove > overviews and gets metadata > + // directly from GeoRasterImage or using JAI > + return TiffUtilsV2.readImageAndMetadata(tiffFile, viewPortEnvelope, > requestedRes, stats); > } else if (fileNameOrURL.toLowerCase().endsWith(".flt")) { > > GridFloat gf = new GridFloat(fileNameOrURL); > > Modified: core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java > =================================================================== > --- core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java > 2020-09-22 14:56:54 UTC (rev 6517) > +++ core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java > 2020-09-22 16:07:41 UTC (rev 6518) > @@ -29,6 +29,9 @@ > import org.apache.commons.imaging.formats.tiff.TiffImageParser; > import org.xml.sax.SAXException; > > +import com.sun.media.jai.codec.FileSeekableStream; > +import com.sun.media.jai.codec.TIFFDirectory; > +import com.sun.media.jai.codec.TIFFField; > import com.vividsolutions.jts.geom.Coordinate; > import com.vividsolutions.jts.geom.Envelope; > import com.vividsolutions.jump.workbench.Logger; > @@ -90,6 +93,7 @@ > return JAI.create("scale", parameterBlock); > } > > + > /** > * Method to build an ImageAndMetadata file > * An ImageAndMetadata groups the Envelope, the Image, the Statistics and > @@ -201,7 +205,134 @@ > } > > } > + > + > + > + > + > + /** > + * New method to build an ImageAndMetadata file > + * An ImageAndMetadata groups the Envelope, the Image, the Statistics and > + * NoData value of a TIF file > + * Removed reading overviews and dependency to commons imaging library > + * @param tiffFile > + * @param viewportEnvelope > + * @param requestedRes > + * @param stats > + * @return ImageAndMetadata > + * @throws NoninvertibleTransformException > + * @throws IOException > + * @throws FileNotFoundException > + * @throws TiffTags.TiffReadingException > + * @throws Exception > + */ > + public static ImageAndMetadata readImageAndMetadata(File tiffFile, > Envelope viewportEnvelope, Resolution requestedRes, > + Stats stats) throws NoninvertibleTransformException, IOException, > FileNotFoundException, > + TiffTags.TiffReadingException, Exception { > + RenderedOp renderedOp1 = getRenderedOp(tiffFile); > + Envelope wholeImageEnvelope = getEnvelope(tiffFile); > + > + //[Giuseppe Aruta 2020-sept-22] Deactivated Commons Imaging <TiffTag > class> > + // as it throws an error on computing Resolution. > + // This value can be calculated from envelope and image. > + //Deactivated code > + // TiffTags.TiffMetadata tiffMetadata = > TiffTags.readMetadata(tiffFile); > + //int originalImageWidth = tiffMetadata.getColsCount(); > + //int originalImageHeight = tiffMetadata.getRowsCount(); > + // Resolution cellSize = tiffMetadata.getResolution(); > + // Double noData = tiffMetadata.getNoData(); > + > + //[Giuseppe Aruta 2020-sept-22] > + // Try to read geotiff noData tag using JAI. > + // It also solves the problem of the size of AsterDEM files > + // @ TODO This part should be ported to > + // > com.vividsolutions.jump.workbench.imagery.geoimg.GeoReferencedRaster > + // as only NoData tag is used = 42113 > + final FileSeekableStream fileSeekableStream = new > FileSeekableStream( > + tiffFile.getAbsoluteFile()); > + final TIFFDirectory tiffDirectory = new TIFFDirectory( > + fileSeekableStream, 0); > + Double noData=Double.NEGATIVE_INFINITY; > + final TIFFField[] availTags = tiffDirectory.getFields(); > + try { > + for (final TIFFField availTag : availTags) { > + if (availTag.getTag() == 42113) { > + String noDataString = ""; > + if(availTag.getType()== TIFFField.TIFF_ASCII) { > + noDataString = availTag.toString(); > + if(noDataString.equalsIgnoreCase("NaN")) { > + noDataString = "NaN"; > + } > + } else if(availTag.getType()== TIFFField.TIFF_BYTE) { > + noDataString = new String(availTag.getAsBytes()); > + }else if(availTag.getType()== TIFFField.TIFF_FLOAT) { > + noDataString = Float.toString(availTag.getAsFloat(0)); > + } > + noData = Double.valueOf(noDataString); > + } > + } > + } catch (NumberFormatException e){ > + //[Giuseppe Aruta 2020-sept-22] > + //Sometimes reading NoData fails with NumberFormatException > + //Thus the rastee is not well displayed in the view > + //This code sets a standard (Saga gis) noData value readable for > OpenJUMP > + noData=-99999.0D; > + } > + /////End of NoData reading > + > + > + > + double cellSizeX = > wholeImageEnvelope.getWidth()/renderedOp1.getWidth(); > + double cellSizeY = > wholeImageEnvelope.getHeight()/renderedOp1.getHeight(); > + if (requestedRes == null) { > + requestedRes = new Resolution(cellSizeX, cellSizeY); > + } > + if (stats == null) { > + // Statistics on all pixels > + stats = calculateStats(tiffFile, noData, tiffFile); > + } > > + float xScale = (float) (cellSizeX / requestedRes.getX()); > + float yScale = (float) (cellSizeY / requestedRes.getY()); > + xScale = Math.min(xScale, 1); > + yScale = Math.min(yScale, 1); > + > + RenderedOp renderedOp = readSubsampled(tiffFile, xScale, yScale); > + > + > + Resolution subsetResolution = new > Resolution(wholeImageEnvelope.getWidth() / renderedOp.getWidth(), > + wholeImageEnvelope.getHeight() / renderedOp.getHeight()); > + > + Rectangle imageSubset = > RasterImageIO.getDrawingRectangle(renderedOp.getWidth(), > renderedOp.getHeight(), > + wholeImageEnvelope, viewportEnvelope, subsetResolution); > + > + BufferedImage bufferedImage; > + Envelope imagePartEnvelope; > + int actualImageWidth; > + int actualImageHeight; > + if (imageSubset == null) { > + bufferedImage = null; > + imagePartEnvelope = null; > + actualImageWidth = 0; > + actualImageHeight = 0; > + } else { > + bufferedImage = renderedOp.getAsBufferedImage(imageSubset, > null); > + imagePartEnvelope = getImageSubsetEnvelope(wholeImageEnvelope, > imageSubset, subsetResolution); > + actualImageWidth = bufferedImage.getWidth(); > + actualImageHeight = bufferedImage.getHeight(); > + } > + > + Metadata metadata = new Metadata(wholeImageEnvelope, > imagePartEnvelope, > + new Point(renderedOp1.getWidth(), renderedOp1.getHeight()), > new Point(actualImageWidth, actualImageHeight), > + (cellSizeX + cellSizeY) / 2, (subsetResolution.getX() + > subsetResolution.getY()) / 2, noData, > + stats); > + return new ImageAndMetadata(bufferedImage, metadata); > + > + > + > + > + } > + > /** > * Method to read overviews of a TIF from the file metadata or from an > external .ovr file > * @param tiffFile > > > > _______________________________________________ > Jump-pilot-devel mailing list > Jump-pilot-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel > _______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel