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