Revision: 6626
http://sourceforge.net/p/jump-pilot/code/6626
Author: michaudm
Date: 2020-11-21 19:24:09 +0000 (Sat, 21 Nov 2020)
Log Message:
-----------
Free/close resources to avoid memory leaks and/or filelocks
Modified Paths:
--------------
core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
Modified: core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
2020-11-19 08:02:57 UTC (rev 6625)
+++ core/trunk/src/org/openjump/core/rasterimage/TiffUtilsV2.java
2020-11-21 19:24:09 UTC (rev 6626)
@@ -12,6 +12,7 @@
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.WeakHashMap;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
@@ -37,9 +38,11 @@
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>();
+ private static WeakHashMap<File,GeoReferencedRaster> geoRasterCache = new
WeakHashMap<File,GeoReferencedRaster>();
+
public static RenderedOp getRenderedOp(File tiffFile) throws IOException {
GeoReferencedRaster geoRaster = getGeoReferencedRaster(tiffFile);
RenderedOp rop;
@@ -87,7 +90,7 @@
parameterBlock.addSource(renderedOp);
parameterBlock.add(xScale);
parameterBlock.add(yScale);
- renderedOp = JAI.create("scale", parameterBlock);
+ //renderedOp = JAI.create("scale", parameterBlock);
return JAI.create("scale", parameterBlock);
}
@@ -177,7 +180,6 @@
actualImageWidth = bufferedImage.getWidth();
actualImageHeight = bufferedImage.getHeight();
}
-
Metadata metadata = new Metadata(wholeImageEnvelope,
imagePartEnvelope,
new Point(originalImageWidth, originalImageHeight), new
Point(actualImageWidth, actualImageHeight),
(cellSize.getX() + cellSize.getY()) / 2,
(subsetResolution.getX() + subsetResolution.getY()) / 2, noData,
@@ -225,8 +227,7 @@
* @throws Exception
*/
public static ImageAndMetadata readImageAndMetadata(File tiffFile, Envelope
viewportEnvelope, Resolution requestedRes,
- Stats stats) throws NoninvertibleTransformException, IOException,
FileNotFoundException,
- TiffTags.TiffReadingException, Exception {
+ Stats stats) throws NoninvertibleTransformException, IOException,
FileNotFoundException, Exception {
RenderedOp renderedOp1 = getRenderedOp(tiffFile);
Envelope wholeImageEnvelope = getEnvelope(tiffFile);
@@ -359,12 +360,9 @@
(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
@@ -380,36 +378,36 @@
* @throws IOException
* @throws NoninvertibleTransformException
*/
- private static ImageAndMetadata readImage(File tiffFile, int
overviewIndex, int indexStart, Point originalSize,
+ 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);
+ ImageInputStream imageInputStream =
ImageIO.createImageInputStream(tiffFile);
+ Iterator<ImageReader> iterator =
ImageIO.getImageReaders(imageInputStream);
- if (iterator != null && iterator.hasNext()) {
+ if (iterator != null && iterator.hasNext()) {
- ImageReader imageReader = iterator.next();
- imageReader.setInput(imageInputStream);
- for (int i = 0; i < imageReader.getNumImages(true); i++) {
- if (i + indexStart == overviewIndex) {
+ ImageReader imageReader = iterator.next();
+ imageReader.setInput(imageInputStream);
+ for (int i = 0; i < imageReader.getNumImages(true); i++) {
+ if (i + indexStart == overviewIndex) {
- Resolution subsetResolution = new
Resolution(wholeImageEnvelope.getWidth() / imageReader.getWidth(i),
+ Resolution subsetResolution = new
Resolution(wholeImageEnvelope.getWidth() / imageReader.getWidth(i),
wholeImageEnvelope.getHeight() /
imageReader.getHeight(i));
- Rectangle imageSubset =
RasterImageIO.getDrawingRectangle(imageReader.getWidth(i),
imageReader.getHeight(i),
+ Rectangle imageSubset =
RasterImageIO.getDrawingRectangle(imageReader.getWidth(i),
imageReader.getHeight(i),
wholeImageEnvelope, viewportEnvelope, subsetResolution);
- BufferedImage bufferedImage;
- Envelope imagePartEnvelope;
- int imageWidth;
- int imageHeight;
- if (imageSubset == null) {
+ BufferedImage bufferedImage;
+ Envelope imagePartEnvelope;
+ int imageWidth;
+ int imageHeight;
+ if (imageSubset == null) {
bufferedImage = null;
imagePartEnvelope = null;
imageWidth = 0;
imageHeight = 0;
- } else {
+ } else {
ImageReadParam imageReadParam = new ImageReadParam();
imageReadParam.setSourceRegion(imageSubset);
bufferedImage = imageReader.read(i, imageReadParam);
@@ -416,7 +414,7 @@
imagePartEnvelope =
getImageSubsetEnvelope(wholeImageEnvelope, imageSubset, subsetResolution);
imageWidth = bufferedImage.getWidth();
imageHeight = bufferedImage.getHeight();
- }
+ }
// double originalCellSize = subsetResolution.getX();
// int cellsCount = imageReader.getWidth(i) *
imageReader.getHeight(i);
@@ -428,21 +426,24 @@
// stats = calculateStats(statsBufferedImage,
noDataValue);
// }
- Metadata metadata = new Metadata(wholeImageEnvelope,
imagePartEnvelope, originalSize,
+ Metadata metadata = new
Metadata(wholeImageEnvelope, imagePartEnvelope, originalSize,
new Point(imageWidth, imageHeight),
(originalCellSize.getX() + originalCellSize.getY()) / 2,
(subsetResolution.getX() + subsetResolution.getY()) / 2,
noDataValue, stats);
+ if (imageReader != null) {
+ imageReader.dispose();
+ }
+ if (imageInputStream != null) {
+ imageInputStream.close();
+ }
+ return new ImageAndMetadata(bufferedImage,
metadata);
+ }
+ }
- return new ImageAndMetadata(bufferedImage, metadata);
+ }
+ return null;
- }
- }
+ }
- }
-
- return null;
-
- }
-
/**
* Method to read Statistics of TIF file (if available) from file
metadata or
* from an external aux.xml file
@@ -496,6 +497,7 @@
return createStatsXml(tiffFile, noDataValue, auxXmlFile);
}
+
/**
* Method to compute statistic of a TIF file and write as aux.xml file
* @param tiffFile
_______________________________________________
Jump-pilot-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel