Revision: 6564
http://sourceforge.net/p/jump-pilot/code/6564
Author: edso
Date: 2020-10-02 12:23:18 +0000 (Fri, 02 Oct 2020)
Log Message:
-----------
implement Elevation floating point data rendering according to commons-imaging
examples from
http://commons.apache.org/proper/commons-imaging/xref-test/org/apache/commons/imaging/examples/tiff/
and
https://issues.apache.org/jira/browse/IMAGING-267
Modified Paths:
--------------
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/AbstractGraphicImage.java
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsImageFactory.java
Added Paths:
-----------
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsTIFFImage.java
Modified:
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/AbstractGraphicImage.java
===================================================================
---
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/AbstractGraphicImage.java
2020-10-02 04:48:19 UTC (rev 6563)
+++
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/AbstractGraphicImage.java
2020-10-02 12:23:18 UTC (rev 6564)
@@ -244,7 +244,7 @@
image_h += (topOffset + botOffset);
RenderingHints rh = new RenderingHints(RenderingHints.KEY_INTERPOLATION,
- RenderingHints.VALUE_INTERPOLATION_BILINEAR);
+ RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g.setRenderingHints(rh);
// parameters: destination corners then source corners
Modified:
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsImageFactory.java
===================================================================
---
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsImageFactory.java
2020-10-02 04:48:19 UTC (rev 6563)
+++
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsImageFactory.java
2020-10-02 12:23:18 UTC (rev 6564)
@@ -33,6 +33,7 @@
*/
import org.apache.commons.imaging.ImageFormat;
import org.apache.commons.imaging.ImageFormats;
+import org.apache.commons.io.FilenameUtils;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.imagery.ReferencedImage;
@@ -43,6 +44,10 @@
}
public ReferencedImage createImage(String location) {
+ String ext = FilenameUtils.getExtension(location).toLowerCase();
+ if (ext.matches("tiff?"))
+ return new CommonsTIFFImage(location, null);
+
return new CommonsImage(location, null);
}
Added:
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsTIFFImage.java
===================================================================
---
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsTIFFImage.java
(rev 0)
+++
core/trunk/src/com/vividsolutions/jump/workbench/imagery/graphic/CommonsTIFFImage.java
2020-10-02 12:23:18 UTC (rev 6564)
@@ -0,0 +1,113 @@
+package com.vividsolutions.jump.workbench.imagery.graphic;
+
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import org.apache.commons.imaging.FormatCompliance;
+import org.apache.commons.imaging.common.bytesource.ByteSource;
+import org.apache.commons.imaging.common.bytesource.ByteSourceInputStream;
+import org.apache.commons.imaging.formats.tiff.TiffContents;
+import org.apache.commons.imaging.formats.tiff.TiffDirectory;
+import org.apache.commons.imaging.formats.tiff.TiffField;
+import org.apache.commons.imaging.formats.tiff.TiffRasterData;
+import org.apache.commons.imaging.formats.tiff.TiffRasterStatistics;
+import org.apache.commons.imaging.formats.tiff.TiffReader;
+import org.apache.commons.imaging.formats.tiff.constants.TiffConstants;
+import org.apache.commons.imaging.formats.tiff.constants.TiffTagConstants;
+import
org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PaletteEntry;
+import
org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PaletteEntryForRange;
+import
org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PaletteEntryForValue;
+import
org.apache.commons.imaging.formats.tiff.photometricinterpreters.floatingpoint.PhotometricInterpreterFloat;
+import org.openjump.util.UriUtil;
+
+import com.vividsolutions.jts.geom.Envelope;
+import com.vividsolutions.jump.io.CompressedFile;
+import com.vividsolutions.jump.workbench.imagery.ReferencedImageException;
+
+public class CommonsTIFFImage extends CommonsImage {
+
+ public CommonsTIFFImage(String location, WorldFile wf) {
+ super(location, wf);
+ }
+
+ @Override
+ protected void initImage() throws ReferencedImageException {
+ BufferedImage image = getImage();
+ if (image != null)
+ return;
+
+ String uri = getUri();
+
+ try {
+ ByteSource byteSource = new
ByteSourceInputStream(CompressedFile.openFile(uri), UriUtil.getFileName(uri));
+ TiffReader tiffReader = new TiffReader(true);
+ TiffContents contents = tiffReader.readDirectories(byteSource, true,
FormatCompliance.getDefault());
+ TiffDirectory directory = contents.directories.get(0);
+
+ if (!directory.hasTiffFloatingPointRasterData()) {
+ super.initImage();
+ return;
+ }
+
+// PhotometricInterpreterFloat pi = new PhotometricInterpreterFloat(0.0f,
1.0f);
+// HashMap<String, Object> params = new HashMap<>();
+// params.put(TiffConstants.PARAM_KEY_CUSTOM_PHOTOMETRIC_INTERPRETER, pi);
+// directory.getTiffImage(params);
+//
+// float maxValue = pi.getMaxFound();
+// float minValue = pi.getMinFound();
+
+ HashMap<String, Object> params = new HashMap<>();
+ TiffRasterData rasterData = directory.getFloatingPointRasterData(params);
+
+ float excludedValue = Float.NaN;
+ TiffRasterStatistics simpleStats;
+ if (false) { // we can add a custom "No Data" indicator
+ simpleStats = rasterData.getSimpleStatistics(9999);
+ } else {
+ // just gather the standard statistics
+ simpleStats = rasterData.getSimpleStatistics();
+ }
+
+ float minValue = simpleStats.getMinValue();
+ float maxValue = simpleStats.getMaxValue();
+
+// PhotometricInterpreterFloat grayScale = new
PhotometricInterpreterFloat(minValue, maxValue);
+// params = new HashMap<>();
+// params.put(TiffConstants.PARAM_KEY_CUSTOM_PHOTOMETRIC_INTERPRETER,
grayScale);
+// BufferedImage bImage = directory.getTiffImage(params);
+
+ TiffField piField =
directory.findField(TiffTagConstants.TIFF_TAG_PHOTOMETRIC_INTERPRETATION);
+ // default is black to white ascending
+ boolean ascendingGrayTones = (piField == null
+ || piField.getIntValue() !=
TiffTagConstants.PHOTOMETRIC_INTERPRETATION_VALUE_WHITE_IS_ZERO);
+
+ List<PaletteEntry> paletteList = new ArrayList();
+ if (!Float.isNaN(excludedValue)) {
+ // draw the excluded value in red.
+ paletteList.add(new PaletteEntryForValue(excludedValue, Color.red));
+ }
+ paletteList.add(new PaletteEntryForRange(minValue, maxValue,
ascendingGrayTones ? Color.black : Color.white,
+ ascendingGrayTones ? Color.white : Color.black));
+// paletteList.add(new PaletteEntryForValue(maxValue, Color.white));
+ PhotometricInterpreterFloat photometricInterpreter = new
PhotometricInterpreterFloat(paletteList);
+
+ params.put(TiffConstants.PARAM_KEY_CUSTOM_PHOTOMETRIC_INTERPRETER,
photometricInterpreter);
+ BufferedImage bImage = directory.getTiffImage(params);
+
+ setImage(bImage);
+
+ } catch (Exception e) {
+ throw new ReferencedImageException(e);
+ }
+ }
+
+ @Override
+ public Envelope getEnvelope() throws ReferencedImageException {
+ // TODO implement or reuse TiffDir/Tag georeferencing
+ return super.getEnvelope();
+ }
+}
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel