Hi MIchael, I tested OpenJUMP 6618 with the modification you did yesterday. Maybe it is too early for a test or a comment and you are still working on this class. I only observed that this modification deactivated raster styling (RaterImageLayer>Layer drop down menu>Raster styles). Best regards and thanks again for your help. Peppe
Il giorno sab 7 nov 2020 alle ore 17:16 jump-pilot-svn--- via Jump-pilot-devel <jump-pilot-devel@lists.sourceforge.net> ha scritto: > Revision: 6618 > http://sourceforge.net/p/jump-pilot/code/6618 > Author: michaudm > Date: 2020-11-07 16:16:37 +0000 (Sat, 07 Nov 2020) > Log Message: > ----------- > Cleanup of RasterImageLayer and some related classes > > Modified Paths: > -------------- > > core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java > core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java > core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java > > core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java > > Modified: > core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java > =================================================================== > --- > core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java > 2020-10-27 12:47:46 UTC (rev 6617) > +++ > core/trunk/src/com/vividsolutions/jump/workbench/ui/cursortool/FeatureInfoTool.java > 2020-11-07 16:16:37 UTC (rev 6618) > @@ -220,24 +220,22 @@ > int l=0; > for(RasterImageLayer rasterImageLayer : layerables_l) { > layerNames[l] = rasterImageLayer.getName(); > - try { > > - cellValues[l] = ""; > - for(int b=0; b<rasterImageLayer.getNumBands(); b++) { > - Double cellValue = > rasterImageLayer.getCellValue(coord.x, coord.y, b); > - if(cellValue != null) { > - if(rasterImageLayer.isNoData(cellValue)) { > - cellValues[l] = Double.toString(Double.NaN); > - } else { > - cellValues[l] = > cellValues[l].concat(Double.toString(cellValue)); > - } > + cellValues[l] = ""; > + for(int b=0; b<rasterImageLayer.getNumBands(); b++) { > + Double cellValue = rasterImageLayer.getCellValue(coord.x, > coord.y, b); > + if(cellValue != null) { > + if(rasterImageLayer.isNoData(cellValue)) { > + cellValues[l] = Double.toString(Double.NaN); > + } else { > + cellValues[l] = > cellValues[l].concat(Double.toString(cellValue)); > } > - cellValues[l] = cellValues[l].concat(";"); > + } else { > + cellValues[l] = "???"; > } > + cellValues[l] = cellValues[l].concat(";"); > + } > > - } catch(RasterDataNotFoundException ex) { > - cellValues[l] = "???"; > - } > l++; > } > > > Modified: > core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java > =================================================================== > --- > core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java > 2020-10-27 12:47:46 UTC (rev 6617) > +++ > core/trunk/src/org/openjump/core/rasterimage/GDALInternalMetadata.java > 2020-11-07 16:16:37 UTC (rev 6618) > @@ -94,7 +94,7 @@ > @Override > public void characters(char[] ac, int i, int j) throws SAXException { > tmpValue = new String(ac, i, j); > - System.out.println(tmpValue); > + //System.out.println(tmpValue); > } > > private String tmpValue; > > Modified: > core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java > =================================================================== > --- core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java > 2020-10-27 12:47:46 UTC (rev 6617) > +++ core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java > 2020-11-07 16:16:37 UTC (rev 6618) > @@ -21,7 +21,6 @@ > import java.awt.image.IndexColorModel; > import java.awt.image.Raster; > import java.awt.image.renderable.ParameterBlock; > -import java.io.FileNotFoundException; > import java.io.IOException; > import java.util.UUID; > > @@ -80,11 +79,8 @@ > protected double oldScaleXImg2Canvas; > > protected int xOffset, yOffset; > - > - //protected static PersonalLogger logger = new > PersonalLogger(DebugUserIds.OLE); > - > + > protected double transparencyLevel = .0f; > - > > protected static long availRAM = Runtime.getRuntime().maxMemory(); > protected static double freeRamFactor = 0.5; > @@ -104,11 +100,10 @@ > //-- [sstein 2nd Aug 2010] new, since we scale the image now for > display > protected Raster actualRasterData = null; > protected boolean rasterDataChanged = false; //may be needed for > rescaling the image values > - protected boolean wasScaledForDisplay = false; > + //protected boolean wasScaledForDisplay = false; // never used ! > //-- end > > - protected BufferedImage imageProcessingStep1 = null, > imageProcessingStep2 = null; > - > + protected BufferedImage scaledBufferedImage = null; > > protected Envelope actualImageEnvelope = null, visibleEnv = null, > oldVisibleEnv; > protected Envelope originalImageEnvelope = null; > @@ -120,13 +115,12 @@ > protected boolean firingAppearanceEvents = true; > > /** > - * Flag to control if the image should be deleted from RAM as soon as > possible to save RAM or if it should be keeped e.g. because it was generated > + * Flag to control if the image should be deleted from RAM as soon as > possible to save RAM > + * or if it should be keeped e.g. because it was generated > * dynamically and can not be loaded from a file again, once it was > deleted. > */ > protected boolean needToKeepImage = false; > - > - protected static final Point nullpunkt = new Point(0,0); > - > + > protected Color transparentColor = null; > protected boolean transparencyColorNeedsToBeApplied = false; > > @@ -149,9 +143,7 @@ > */ > public RasterImageLayer() { > super(); > - > getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, > true); > - > } > > /** > @@ -184,13 +176,14 @@ > } > > /** > - *@param name name of the layer > - *@param layerManager > - * @param imageFileName > - *@param imageToDisplay the image (if already loaded) or null > - * @param wholeImageEnvelope > + * @param name name of the layer > + * @param layerManager the LayerManager > + * @param imageFileName the name of the image file > + * @param imageToDisplay the image (if already loaded) or null > + * @param wholeImageEnvelope the image envelope in model (real world) > coordinates > */ > - public RasterImageLayer(String name, LayerManager layerManager, > String imageFileName, BufferedImage imageToDisplay, Envelope > wholeImageEnvelope) { > + public RasterImageLayer(String name, LayerManager layerManager, > String imageFileName, > + BufferedImage imageToDisplay, Envelope > wholeImageEnvelope) { > super(name, layerManager); > > getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, > true); > @@ -219,13 +212,18 @@ > * no file name, but an image > * > *@param name name of the layer > - *@param layerManager > + *@param layerManager the LayerManager > *@param imageToDisplay the image (if already loaded) or null > *@param newRaster the raster (if already loaded) or null > - *@param envelope real-world coordinates of the image > + *@param wholeImageEnvelope the image envelope in model (real world) > coordinates > */ > public RasterImageLayer(String name, LayerManager layerManager, > BufferedImage imageToDisplay, Raster newRaster, Envelope > wholeImageEnvelope) { > super(name, layerManager); > + > + if (imageToDisplay == null || newRaster == null) { > + Logger.warn("imageToDisplay and newRaster must not be null"); > + return; > + } > > getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, > true); > > @@ -232,16 +230,8 @@ > this.setNeedToKeepImage(true); > this.originalImageEnvelope = wholeImageEnvelope; > > - if (imageToDisplay != null) > - this.setImage(imageToDisplay); > - else{ > - //logger.printError("given image is NULL"); > - } > - if (newRaster != null) { > -// this.setRasterData(newRaster); > - }else{ > - //logger.printError("given raster is NULL"); > - } > + this.setImage(imageToDisplay); > + > //[sstein 9.Aug.2010] > long avram = getAvailRAM(); > if(avram > 256000000){ > @@ -265,12 +255,9 @@ > public Object clone() throws CloneNotSupportedException { > RasterImageLayer raster = null; > try { > - raster = new RasterImageLayer(getName(), getLayerManager(), > getImageFileName(), getImageForDisplay(), new > Envelope(getWholeImageEnvelope())); > + raster = new RasterImageLayer(getName(), getLayerManager(), > getImageFileName(), > + getImageForDisplay(), new > Envelope(getWholeImageEnvelope())); > raster.needToKeepImage = needToKeepImage; > - } catch (IOException ex) { > - Logger.error(ex); > - } catch (NoninvertibleTransformException ex) { > - Logger.error(ex); > } catch (Exception ex) { > Logger.error(ex); > } > @@ -284,8 +271,7 @@ > } > > /** > - * apply a scale operation to the image and return the > - * new image. > + * apply a scale operation to the image and return the new image. > */ > protected BufferedImage scaleImage(BufferedImage im, float xScale, > float yScale) { > ParameterBlock pb = new ParameterBlock(); > @@ -295,40 +281,27 @@ > > return JAI.create("Scale", pb, null).getAsBufferedImage(); > } > - > - > - > - protected BufferedImage createOneColorImage(double scaleXImg2Canvas, > double scaleYImg2Canvas){ > - //logger.printDebug("fixing 1px scale: scaleXImg2Canvas = " + > scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas); > - //logger.printDebug("this.imageProcessingStep1: " + > this.imageProcessingStep1 .getWidth() + ", " + > this.imageProcessingStep1.getHeight()); > - > - scaleXImg2Canvas = Math.min( Math.abs(scaleXImg2Canvas), > Math.abs(visibleRect.width) ); > - scaleYImg2Canvas = Math.min( Math.abs(scaleYImg2Canvas), > Math.abs(visibleRect.height) ); > - > - //logger.printDebug("fixed 1px scale: scaleXImg2Canvas = " + > scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas); > - > + > + > + /** > + * Create a single color image in the case where a single image pixel > is visible > + * @param color color of the pixel > + * @return a single color BufferedImage > + */ > + protected BufferedImage createOneColorImage(Color color){ > BufferedImage bim = new BufferedImage(visibleRect.width, > visibleRect.height, BufferedImage.TYPE_INT_ARGB); > - > Graphics2D grfcs = bim.createGraphics(); > - > - grfcs.setColor(new Color(this.imageProcessingStep1.getRGB(0,0))); > - > - //logger.printDebug("color: " + new > Color(this.imageProcessingStep1.getAsBufferedImage().getRGB(0,0)).toString()); > - > + grfcs.setColor(color); > grfcs.fillRect( 0, 0, bim.getWidth(), bim.getHeight() ); > - > grfcs.dispose(); > - > + bim.flush(); > return bim; > - > - //return PlanarImage.wrapRenderedImage(bim); > } > > - BufferedImage imageFinal = null; > /** > * Creates the image to draw > - * @param layerViewPanel > - * @return > + * @param layerViewPanel the LayerViewPanel where the image will be > drawn > + * @return the BufferedImage to be drawn > */ > public BufferedImage createImage(LayerViewPanel layerViewPanel) { > > @@ -337,32 +310,31 @@ > if (!this.isVisible() || this.transparencyLevel >= 1.0){ > this.setImageProcessingMode(RasterImageLayer.MODE_NONE); > this.clearImageAndRaster(true); > - //logger.printDebug("!visible"); > + Logger.debug("Image " + imageFileName + " is not visible"); > return null; > } > - > + > BufferedImage imageToDraw = null; > > try { > - > - //GeoTIFFRaster grr = new GeoTIFFRaster((new > File(imageFileName)).toURI().toString()); > - > + > java.awt.Point imageDims = > RasterImageIO.getImageDimensions(imageFileName); > - > + > + assert imageDims != null; > origImageWidth = imageDims.x; > origImageHeight = imageDims.y; > visibleRect = viewport.getPanel().getVisibleRect(); > - > + > int visibleX1 = visibleRect.x; > int visibleY1 = visibleRect.y; > int visibleX2 = visibleX1 + visibleRect.width; > int visibleY2 = visibleY1 + visibleRect.height; > - > - Coordinate upperLeftVisible = > viewport.toModelCoordinate(nullpunkt); > + > + // Viewport envelope in model coordinates > + Coordinate upperLeftVisible = viewport.toModelCoordinate(new > Point(visibleX1, visibleY1)); > Coordinate lowerRightVisible = viewport.toModelCoordinate(new > Point(visibleX2, visibleY2)); > - > - Envelope newVisibleEnv = new Envelope(upperLeftVisible.x, > lowerRightVisible.x, upperLeftVisible.y, lowerRightVisible.y); > - > + Envelope newVisibleEnv = new Envelope(upperLeftVisible, > lowerRightVisible); > + > setImageSet(false); > > if (visibleEnv == null || visibleEnv.getMinX() != > newVisibleEnv.getMinX() || visibleEnv.getMaxX() != newVisibleEnv.getMaxX() > || > @@ -375,7 +347,8 @@ > if(image == null) { > return null; > } > - > + > + // Coordinates of actual image in viewport coordinates > Point2D upperLeftCornerOfImage = viewport.toViewPoint(new > Coordinate(getActualImageEnvelope().getMinX(), > getActualImageEnvelope().getMaxY())); > Point2D lowerRightCornerOfImage = > viewport.toViewPoint(new Coordinate(getActualImageEnvelope().getMaxX(), > getActualImageEnvelope().getMinY())); > > @@ -385,50 +358,37 @@ > long totalMem = Runtime.getRuntime().totalMemory(); > long freeMem = Runtime.getRuntime().freeMemory(); > long committedMemory = totalMem - freeMem; > - double maxMemoryToCommit = availRAM - minRamToKeepFree; > - boolean needFreeRAM = (committedMemory > > maxMemoryToCommit); > - if(needFreeRAM == false){ > - setImage(stretchImageValuesForDisplay()); > - //Reverted to previous code as now rLayers are > loaded using > - // ImageIO which solved image display > - //described on bug 498 > - //DEM > - /*if (stats.getBandCount()<3) { > - setImage(stretchImageValuesForDisplay()); > - } else {//Other images > - try { > - > setImage(stretchImageValuesForDisplay());} > - catch (ArrayIndexOutOfBoundsException e){ > - setImage(getImageForDisplay()); > - } > - }*/ > - > - > - // setImage(stretchImageValuesForDisplay()); > - wasScaledForDisplay = true; > > + // There is freeRam available to cache the new image > + //if(!needFreeRAM){ > + setImage(stretchImageValuesForDisplay()); > + > + //wasScaledForDisplay = true; > + if(committedMemory + minRamToKeepFree < availRAM){ > setNeedToKeepImage(true); //so small images are not > reloaded every time > } > > //[sstein end] > - imagePart = getVisibleImageCoordinatesOfImage( > image.getWidth(), image.getHeight(), visibleEnv, getActualImageEnvelope() ); > + imagePart = > getVisibleImageCoordinatesOfImage(image.getWidth(), image.getHeight(), > + visibleEnv, getActualImageEnvelope()); > > double scaleXImg2Canvas = scaledWidth / image.getWidth(); > double scaleYImg2Canvas = scaledHeight / > image.getHeight(); > > - if (imageProcessingStep2 == null || scaleXImg2Canvas != > oldScaleXImg2Canvas || > + if (scaledBufferedImage == null || scaleXImg2Canvas != > oldScaleXImg2Canvas || > !RasterImageLayer.tilesAreNotNullAndCongruent( > visibleEnv, oldVisibleEnv)){ > > - imageProcessingStep1 = getVisiblePartOfTheImage( > getImageForDisplay(), imagePart ); > + scaledBufferedImage = getVisiblePartOfTheImage( > getImageForDisplay(), imagePart ); > > - if ( imageProcessingStep1 != null) { > + if (scaledBufferedImage != null) { > // avoid an 1 pixel by 1 pixel image to get > scaled to thousands by thousands pixels causing an out of memory error > if (imagePart.width == 1 || imagePart.height == > 1){ > xOffset = 0; > yOffset = 0; > - imageProcessingStep2 = > createOneColorImage(scaleXImg2Canvas, scaleYImg2Canvas); > + scaledBufferedImage = createOneColorImage( > + new > Color(scaledBufferedImage.getRGB(0,0))); > } else { > - imageProcessingStep2 = > getScaledImageMatchingVisible( imageProcessingStep1, scaleXImg2Canvas, > scaleYImg2Canvas ); > + scaledBufferedImage = > getScaledImageMatchingVisible(scaledBufferedImage, scaleXImg2Canvas, > scaleYImg2Canvas ); > } > > } else { > @@ -437,7 +397,7 @@ > > if (transparentColor!=null) > transparencyColorNeedsToBeApplied = true; > > - imageProcessingStep1 = null; > + //imageProcessingStep1 = null; > > xOffset = (int)(xOffset *scaleXImg2Canvas); > yOffset = (int)(yOffset *(-scaleYImg2Canvas)); > @@ -450,10 +410,12 @@ > > } > > - if (imageProcessingStep2 != null && > transparencyColorNeedsToBeApplied ){ > - imageToDraw = setupTransparency(imageProcessingStep2); > - } else if (imageProcessingStep2 != null) { > - imageToDraw = imageProcessingStep2; > + if (scaledBufferedImage != null && > transparencyColorNeedsToBeApplied ){ > + scaledBufferedImage.flush(); > + imageToDraw = setupTransparency(scaledBufferedImage); > + } else if (scaledBufferedImage != null) { > + scaledBufferedImage.flush(); > + imageToDraw = scaledBufferedImage; > } > > > @@ -465,16 +427,17 @@ > if (Runtime.getRuntime().freeMemory() < > RasterImageLayer.getMinRamToKeepFree()){ > clearImageAndRaster(true); > } > - > + //BufferedImage imageFinal = null; > if (imageToDraw != null) { > - imageFinal = imageToDraw; > - return imageFinal; > - } else if (imageProcessingStep2!=null) { > - imageFinal = imageProcessingStep2; > - return imageFinal; > + //imageFinal = imageToDraw; > + imageToDraw.flush(); > + return imageToDraw; > + } else if (scaledBufferedImage!=null) { > + //imageFinal = imageProcessingStep2; > + scaledBufferedImage.flush(); > + return scaledBufferedImage; > } > > - > return null; > } > > @@ -489,11 +452,12 @@ > // Hence we should work with committed memory as I did > above??? > boolean reallyNeedToFreeRAM = (Runtime.getRuntime().freeMemory() > < minRamToKeepFree); > if (!needToKeepImage && reallyNeedToFreeRAM ){ > + flushImages(garbageCollect); > //this.image = null; > //rasterData = null; //[sstein 2Aug2010] line added > - wasScaledForDisplay = false; //[sstein 20Aug2010] line added > + //wasScaledForDisplay = false; //[sstein 20Aug2010] line added > } > - if (garbageCollect){ > + else if (garbageCollect){ > Runtime.getRuntime().gc(); > } > return reallyNeedToFreeRAM; > @@ -507,14 +471,10 @@ > if (image!=null) > image.flush(); > image = null; > - > - if (imageProcessingStep1!=null) > - imageProcessingStep1.flush(); > - imageProcessingStep1 = null; > - > - if (imageProcessingStep2!=null) > - imageProcessingStep2.flush(); > - imageProcessingStep2 = null; > + > + if (scaledBufferedImage!=null) > + scaledBufferedImage.flush(); > + scaledBufferedImage = null; > > if (garbageCollect){ > Runtime.getRuntime().gc(); > @@ -521,7 +481,7 @@ > } > } > > - public void reLoadImage() throws IOException, > NoninvertibleTransformException, FileNotFoundException, > TiffTags.TiffReadingException, Exception{ > + public void reLoadImage() throws Exception { > > //if (image == null && !needToKeepImage){ > > @@ -553,7 +513,7 @@ > if(image != null) { > setImage(image); > } > - wasScaledForDisplay = false; > + //wasScaledForDisplay = false; > > if(image != null) { > actualRasterData = image.copyData(null); > @@ -566,9 +526,7 @@ > * use this to assign the raster data again > * the method is called from getRasterData(); > */ > - public void reLoadImageButKeepImageForDisplay() throws IOException, > - NoninvertibleTransformException, FileNotFoundException, > TiffTags.TiffReadingException, Exception{ > - WorkbenchContext context = getWorkbenchContext(); > + public void reLoadImageButKeepImageForDisplay() throws Exception { > BufferedImage pi = getImageForDisplay(); > //[sstein 24.Sept.2010] commented out: > //PlanarImage dontNeedThisImage = RasterImageLayer.loadImage( > context, imageFileName); //causes error for .clone() > @@ -638,12 +596,10 @@ > // Symbology exists > double value = actualRasterData.getSampleDouble(col, > row, 0); > > - /** > - * If symbology min value is higher than raster min > value > - * the value becomes equal to the symbology min value > - */ > - > - Double[] symbologyClassLimits = > symbology.getColorMapEntries_tm().keySet().toArray(new > Double[symbology.getColorMapEntries_tm().keySet().size()]); > + > + // If symbology min value is higher than raster min > value > + // the value becomes equal to the symbology min value > + Double[] symbologyClassLimits = > symbology.getColorMapEntries_tm().keySet().toArray(new Double[0]); > double symbMinValue = symbologyClassLimits[0]; > double symbFirstValue = symbologyClassLimits[0]; > if(this.isNoData(symbFirstValue)) { > @@ -675,7 +631,6 @@ > } > } > } > - > return newImage; > } > > @@ -764,8 +719,9 @@ > > /** > * Method to change the coordinates of the image and later apply the > - * changes to the RasterImageLayer by using {@link > RasterImageLayer#setGeometryAsEnvelope(Geometry)}. > - *@return return the imageEnvelope (= bounding box) as a geometry, > + * changes to the RasterImageLayer by using > + * {@link RasterImageLayer#setGeometryAsWholeImageEnvelope(Geometry)}. > + * @return return the imageEnvelope (= bounding box) as a geometry, > */ > public Polygon getWholeImageEnvelopeAsGeometry(){ > Coordinate[] coordinates = new Coordinate[5]; > @@ -796,7 +752,8 @@ > } > > /** > - * Method to set the coordinates of the image, e.g. after changing > them after using {@link RasterImageLayer#getEnvelopeAsGeometry()}. > + * Method to set the coordinates of the image, e.g. after changing > them after using > + * {@link RasterImageLayer#getWholeImageEnvelopeAsGeometry()}. > */ > public void setGeometryAsWholeImageEnvelope(Geometry geometry){ > setWholeImageEnvelope(geometry.getEnvelopeInternal()); > @@ -808,7 +765,7 @@ > > /** > * Add transparency to the image (more exactly: to each pixel which a > color == this.transparentColor) > - *@param pImage the image > + *@param bim the image > */ > private BufferedImage setupTransparency(BufferedImage bim){ > //BufferedImage bim = pImage.getAsBufferedImage(); > @@ -822,21 +779,18 @@ > > int transparentColor = this.getTransparentColor().getRGB(); > > - int currentColor = -1; > int[] argb = new int[4]; > > if (!cm.hasAlpha()){ > bim = RasterImageLayer.makeBufferedImage(bim); > - cm = bim.getColorModel(); > + //cm = bim.getColorModel(); > > } > > for( int w=0; w<bim.getWidth(); w++){ > for (int h=0; h<bim.getHeight(); h++){ > - > - currentColor = bim.getRGB(w,h); > - > - if (currentColor==transparentColor){ > + > + if (bim.getRGB(w,h)==transparentColor){ > Color color = new Color(bim.getRGB(w, h)); > > argb[0] = fullTransparencyAlpha; > @@ -854,14 +808,11 @@ > > private void setImageProcessingMode( int nr ){ > if (lastImgProcessingMode != nr){ > - if (imageProcessingStep1!=null) > - imageProcessingStep1.flush(); > - imageProcessingStep1 = null; > - > - if (imageProcessingStep2!=null) > - imageProcessingStep2.flush(); > - imageProcessingStep2 = null; > > + if (scaledBufferedImage!=null) > + scaledBufferedImage.flush(); > + scaledBufferedImage = null; > + > imagePart = null; > > oldScaleXImg2Canvas = -1; > @@ -887,16 +838,17 @@ > > /** > * creates a BufferedImage out of an Image > - *@param im the Image > - *@return the BufferedImage > + * @param im the Image > + * @return the BufferedImage > */ > - public static final BufferedImage makeBufferedImage(Image im) { > + public static BufferedImage makeBufferedImage(Image im) { > BufferedImage copy = new BufferedImage(im.getWidth(null), > im.getHeight(null), BufferedImage.TYPE_INT_ARGB); > // create a graphics context > Graphics2D g2d = copy.createGraphics(); > // copy image > g2d.drawImage(im,0,0,null); > - g2d.dispose(); > + g2d.dispose(); > + //copy.flush(); > return copy; > } > > @@ -913,7 +865,7 @@ > > } > > - public BufferedImage getTileAsImage( Envelope wantedEnvelope ) throws > IOException, NoninvertibleTransformException, FileNotFoundException, > TiffTags.TiffReadingException, Exception{ > + public BufferedImage getTileAsImage( Envelope wantedEnvelope ) throws > Exception{ > double imgWidth = image.getWidth(); > double imgHeight = image.getHeight(); > Envelope imageEnv = getActualImageEnvelope(); > @@ -990,8 +942,9 @@ > graf.drawImage(imgTile, xTileOffset, yTileOffset, > imgTile.getWidth(), imgTile.getHeight(), backgroundColor, null); > graf.dispose(); > > - this.clearImageAndRaster(false); > - > + //this.clearImageAndRaster(false); > + imgTile.flush(); > + result.flush(); > return result; > } > > @@ -1098,14 +1051,13 @@ > > Rectangle visible = viewport.getPanel().getVisibleRect(); > > - Point2D upperLeftCorner = null; > - Point2D lowerRightCorner = null; > + Point2D upperLeftCorner; > + Point2D lowerRightCorner; > > try { > upperLeftCorner = viewport.toViewPoint(new > Coordinate(imageEnv.getMinX(), imageEnv.getMaxY())); > lowerRightCorner = viewport.toViewPoint(new > Coordinate(imageEnv.getMaxX(), imageEnv.getMinY())); > } catch(java.awt.geom.NoninvertibleTransformException ne) { > - //logger.printError(ne.getLocalizedMessage()); > ne.printStackTrace(); > return null; > } > @@ -1115,7 +1067,7 @@ > int visibleX2 = visibleX1 + visible.width; > int visibleY2 = visibleY1 + visible.height; > > - Coordinate upperLeftVisible = > viewport.toModelCoordinate(nullpunkt); > + Coordinate upperLeftVisible = viewport.toModelCoordinate(new > Point(visibleX1, visibleY1)); > Coordinate lowerRightVisible = viewport.toModelCoordinate(new > Point(visibleX2, visibleY2)); > > Envelope newVisibleEnv = new Envelope(upperLeftVisible.x, > lowerRightVisible.x, upperLeftVisible.y, lowerRightVisible.y); > @@ -1136,18 +1088,26 @@ > > return rect; > } > - > - protected Rectangle getVisibleImageCoordinatesOfImage( double > imgWidth, double imgHeight, Envelope visible, Envelope imageEnv ){ > - > - double minVisibleX = Math.max(visible.getMinX(), > imageEnv.getMinX()); > - double minVisibleY = Math.max(visible.getMinY(), > imageEnv.getMinY()); > - > - double maxVisibleX = Math.min(visible.getMaxX(), > imageEnv.getMaxX()); > - double maxVisibleY = Math.min(visible.getMaxY(), > imageEnv.getMaxY()); > - > - double offset2VisibleX = imageEnv.getMinX() - visible.getMinX(); > - double offset2VisibleY = visible.getMaxY() - imageEnv.getMaxY(); > - > + > + /** > + * Returns the visible part of the image in image coordinate > + * @param imgWidth original image width > + * @param imgHeight original image height > + * @param viewportEnv viewport in model coordinates > + * @param imageEnv image envelope in model coordinates > + * @return visible part of the image in image coordinates > + */ > + protected Rectangle getVisibleImageCoordinatesOfImage(double > imgWidth, double imgHeight, > + Envelope > viewportEnv, Envelope imageEnv ){ > + > + Envelope visiblePartOfImage = viewportEnv.intersection(imageEnv); > + if (visiblePartOfImage.isNull()) return null; > + > + // Offset from upperleft corner of viewport to upperleft corner > of image in model coordinates > + double offset2VisibleX = imageEnv.getMinX() - > viewportEnv.getMinX(); > + double offset2VisibleY = viewportEnv.getMaxY() - > imageEnv.getMaxY(); > + > + // Scale to convert from model coordinates to image coordinates > double scaleX = imgWidth / imageEnv.getWidth(); > double scaleY = imgHeight / imageEnv.getHeight(); > > @@ -1163,19 +1123,12 @@ > yOffset = (int)(-offset2VisibleY * scaleY); > } > > - int width = (int)((maxVisibleX-minVisibleX) * scaleX); > - int height = (int)((maxVisibleY-minVisibleY) * scaleY); > - > - if (width < imgWidth && height < imgHeight){ > - width += 1; > - height += 1; > - } > - > - > - if (width <= 0 || height <= 0){ > - return null; > - } > - > + int width = (int)(visiblePartOfImage.getWidth() * scaleX); > + int height = (int)(visiblePartOfImage.getHeight() * scaleY); > + > + if (width < imgWidth) width += 1; > + if (height < imgHeight) height += 1; > + > return new Rectangle(xOffset, yOffset, width, height); > } > > @@ -1200,12 +1153,8 @@ > pb.add((float) desiredImageArea.height); > > return JAI.create("crop", pb).getAsBufferedImage(); > - > } > - > - //return PlanarImage.wrapRenderedImage( > img.getAsBufferedImage( new Rectangle(desiredImageArea.x, > desiredImageArea.y, desiredImageArea.width, desiredImageArea.height), > img.getColorModel() )); > - //logger.printWarning("desired area invalid: " + > (desiredImageArea.width + desiredImageArea.x) + ", " + > (desiredImageArea.height + desiredImageArea.y) + "; image dimensions: " + > img.getWidth() + ", " + img.getHeight()); > - } > + } > return null; > } > > @@ -1224,9 +1173,7 @@ > //origImageHeight = image.getHeight(); > imageSet = true; > } > - > - > - > + > public void setImageSet(boolean imageSet) { > this.imageSet = imageSet; > } > @@ -1237,9 +1184,9 @@ > > /** > * returns the image, this can be modified - i.e. is just a > representation. > - *@return the image > + * @return the image > */ > - public BufferedImage getImageForDisplay() throws IOException, > NoninvertibleTransformException, FileNotFoundException, > TiffTags.TiffReadingException, Exception{ > + public BufferedImage getImageForDisplay() throws Exception { > if (image == null) > reLoadImage(); > return image; > @@ -1246,7 +1193,7 @@ > } > > /** > - *@return true, if the image object was set at least once, else false > + * @return true, if the image object was set at least once, else false > */ > public boolean isImageSet() { > return imageSet; > @@ -1256,7 +1203,7 @@ > * Returns the transparency level of the image. The transparencyLevel > controlls the transparency level of the whole image (all pixels). It > * is independent of the transparency color, that replaces a certain > color in the image. > * The transparencyLevel is expressed as a float within a range from > 0.0 (no transparency) to 1.0 (full transparency). > - *@return the transparency level of the image > + * @return the transparency level of the image > */ > public double getTransparencyLevel() { > return transparencyLevel; > @@ -1451,7 +1398,7 @@ > > /** > * for java2xml > - *@param origImageHeight > + *@param origImageHeight height of original image > */ > public void setOrigImageHeight(int origImageHeight) { > this.origImageHeight = origImageHeight; > @@ -1459,7 +1406,7 @@ > > /** > * for java2xml > - *@param origImageWidth > + * @param origImageWidth width of original image > */ > public void setOrigImageWidth(int origImageWidth) { > this.origImageWidth = origImageWidth; > @@ -1467,7 +1414,7 @@ > > /** > * shows or hides the image in the Jump map > - *@param visible > + *@param visible set true if image must be visible > */ > @Override > public void setVisible(boolean visible) { > @@ -1512,13 +1459,11 @@ > } > > public Raster getRasterData(Rectangle subset) throws IOException { > - > - Raster raster = RasterImageIO.loadRasterData(imageFileName, > subset); > - return raster; > - > + > + return RasterImageIO.loadRasterData(imageFileName, subset); > } > > - public Rectangle getRectangleFromEnvelope(Envelope envelope) throws > IOException { > + public Rectangle getRectangleFromEnvelope(Envelope envelope) { > > double imgWidth = origImageWidth; > double imgHeight = origImageHeight; > @@ -1565,9 +1510,7 @@ > int wantedWidth = (int)(envelope.getWidth() * scaleX); > int wantedHeight = (int)(envelope.getHeight() * scaleY); > > - Rectangle subset = new Rectangle(xOffset, yOffset, wantedWidth, > wantedHeight); > - return subset; > - > + return new Rectangle(xOffset, yOffset, wantedWidth, wantedHeight); > } > > // /** > @@ -1605,7 +1548,7 @@ > > /** > * TODO: sstein test - 25.Sept.2013 > - * @return > + * @return number of bands > */ > public int getNumBands(){ > return numBands; > @@ -1612,17 +1555,16 @@ > } > > public void dispose() { > - // TODO: probably a good idea to remove resources when the layer is > closed up > - // dunno what is needed to clean up Sextante though, hence leave it > for now > + // TODO: probably a good idea to remove resources when the layer > is closed up > + // dunno what is needed to clean up Sextante though, hence leave > it for now > } > > - public Double getCellValue(Coordinate coordinate, int band) throws > RasterDataNotFoundException, IOException { > + public Double getCellValue(Coordinate coordinate, int band) throws > IOException { > > return getCellValue(coordinate.x, coordinate.y, band); > - > } > > - public Double getCellValue(int col, int row, int band) throws > RasterDataNotFoundException, IOException { > + public Double getCellValue(int col, int row, int band) throws > IOException { > > int pos = row * origImageWidth + col; > if(pos <0 || pos > origImageWidth * origImageHeight) return null; > @@ -1631,7 +1573,7 @@ > > } > > - public Double getCellValue(double coordX, double coordY, int band) > throws RasterDataNotFoundException, IOException { > + public Double getCellValue(double coordX, double coordY, int band) > throws IOException { > > double cellSizeX = (originalImageEnvelope.getMaxX() - > originalImageEnvelope.getMinX()) / origImageWidth; > double cellSizeY = (originalImageEnvelope.getMaxY() - > originalImageEnvelope.getMinY()) / origImageHeight; > @@ -1641,13 +1583,13 @@ > > if(col <0 || col >= origImageWidth || row <0 || row >= > origImageHeight) return null; > > - int pos = row * origImageWidth + col; > - double value; > - int bands = stats.getBandCount(); > - value = RasterImageIO.readCellValue(imageFileName, col, row, > band); > - > - > - /* if (stats.getBandCount()<3) { > + //int pos = row * origImageWidth + col; > + //double value; > + //int bands = stats.getBandCount(); > + return RasterImageIO.readCellValue(imageFileName, col, row, band); > + > + /* > + if (stats.getBandCount()<3) { > value = RasterImageIO.readCellValue(imageFileName, col, row, > band); > } else { > try { > @@ -1657,11 +1599,9 @@ > } catch (ArrayIndexOutOfBoundsException e) { > value = RasterImageIO.readCellValue(imageFileName, > col, row, band); > } > - }*/ > - return value; > - // return RasterImageIO.readCellValue(imageFileName, col, row, > band); > - > - } > + } > + */ > + } > > public boolean isNoData(double value) { > if(Double.isInfinite(noDataValue) && Double.isInfinite(value)) { > @@ -1677,19 +1617,15 @@ > return metadata; > } > > - public class RasterDataNotFoundException extends Exception { > + public static class RasterDataNotFoundException extends Exception {} > > - } > - > public static Rectangle getViewportRectangle(WorkbenchContext > workbenchContext) { > > - Rectangle viewportRectangle = new Rectangle( > + return new Rectangle( > 0, > 0, > > workbenchContext.getLayerViewPanel().getVisibleRect().width, > > workbenchContext.getLayerViewPanel().getVisibleRect().height); > - return viewportRectangle; > - > } > > public RasterSymbology getSymbology() { > @@ -1699,13 +1635,6 @@ > public void setSymbology(RasterSymbology symbology) throws > NoninvertibleTransformException { > this.symbology = symbology; > symbologyChanged = true; > -// setImage(stretchImageValuesForDisplay()); > - > -// forceTotalRepaint(); > -// if (isFiringAppearanceEvents()) { > -// fireAppearanceChanged(); > -// } > - imageProcessingStep2 = null; > LayerViewPanel layerViewPanel = > getWorkbenchContext().getLayerViewPanel(); > if(layerViewPanel != null) { > layerViewPanel.getViewport().update(); > @@ -1732,24 +1661,20 @@ > * as "Temporary layers" > */ > public boolean isTemporaryLayer() { > - if (imageFileName.contains(System.getProperty("java.io.tmpdir"))) > { > - return true; > - } else{ > - return false; > - } > - } > - > + return > imageFileName.contains(System.getProperty("java.io.tmpdir")); > + } > > > - private final static String NODATASOURCELAYER= I18N > + private final static String NODATASOURCELAYER = I18N > > > .get("org.openjump.core.ui.plugin.layer.LayerPropertiesPlugIn.nodatasourcelayer.message"); > + > /** > - *@return the file path of a RasterImageLayer.class > - *eg. C/File/imagename.tif. If the file path is a TEMP folder > + * @return the file path of a RasterImageLayer.class > + * eg. C/File/imagename.tif. If the file path is a TEMP folder > * it returns that the layer has no datasource > */ > public String getFilePath() { > - String fileName = null; > + String fileName; > if (!imageFileName.contains(System.getProperty("java.io.tmpdir"))) > { > fileName = getImageFileName(); > } else{ > @@ -1756,7 +1681,7 @@ > fileName = NODATASOURCELAYER; > } > return fileName; > - } > + } > > //[Giuseppe Aruta 04/01/2017] SRS info for RasterImageLayer.class > private SRSInfo srsInfo; > > Modified: > core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java > =================================================================== > --- > core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java > 2020-10-27 12:47:46 UTC (rev 6617) > +++ > core/trunk/src/org/openjump/core/ui/plugin/raster/RasterQueryCursorTool.java > 2020-11-07 16:16:37 UTC (rev 6618) > @@ -138,11 +138,11 @@ > .toArray(new RasterImageLayer[] {}); > //.toArray(new Layerable[] {}); > if (ls != null && ls.length > 0) { > - rLayer = (RasterImageLayer) ls[0]; > + rLayer = ls[0]; > > name = rLayer.getName(); > Coordinate coord = (Coordinate) getCoordinates().get(0); > - String cellValues = null; > + String cellValues; > if > (getPoint().within(rLayer.getWholeImageEnvelopeAsGeometry())) { > try { > cellValues = ""; > @@ -157,6 +157,8 @@ > cellValues = cellValues.concat(Double > .toString(cellValue)); > } > + } else { > + cellValues = cellValues.concat("???"); > } > cellValues = cellValues.concat(" "); > if (Double.isNaN(cellValue)) > @@ -165,8 +167,9 @@ > this.lastClick = cellValues; > } > } > - } catch (RasterDataNotFoundException ex) { > - cellValues = "???"; > + } catch (IOException ex) { > + cellValues = " - "; > + Logger.error(ex); > } > Geometry measureGeometry = null; > if (wasShiftPressed()) { > @@ -311,7 +314,7 @@ > Layerable layer = (Layerable)layerable; > > if (layer instanceof RasterImageLayer) { > - String cellValues = null; > + String cellValues; > try { > cellValues = ""; > Coordinate tentativeCoordinate = getPanel().getViewport() > @@ -330,12 +333,12 @@ > cellValues = cellValues.concat(Double > .toString(cellValue)); > } > + } else { > + cellValues = cellValues.concat("???"); > } > cellValues = cellValues.concat(" "); > } > > - } catch (RasterDataNotFoundException ex) { > - cellValues = "???"; > } catch (IOException e) { > cellValues = " - "; > Logger.error(e); > > > > _______________________________________________ > 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