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

Reply via email to