I'll try to document a bit more. In GeoImage, the operation which needs scale is just an image resizing It supposes scaleX and scaleY are positive. I think this is a bad assumption, but it is another problem and it will be difficult to rewrite the code in a sign sensitive way. So the question is more why it did not take abs(scale) in the code before ? Because scale was made positive in the GeoReferencedRaster. I changed that because here again, we loose an information by making scale positive. I preserved the sign to be able to compute the right envelope in GeoReferencedRaster, and to be able to use it in GeoImage in the future. At the moment, sign is just used in GeoReferencedRaster, and it is ignored (using abs) in GeoImage so that the paint() code still work. Michaël envoyé : 23 novembre 2020 à 11:50 de : edgar.sol...@web.de à : jump-pilot-devel@lists.sourceforge.net objet : Re: [JPP-Devel] SVN: [6625] core/trunk/src/com/vividsolutions/jump/workbench/imagery/ geoimg
hey Mike,
comments inline
On 11/19/2020 9:02, jump-pilot-svn--- via Jump-pilot-devel wrote: Revision: 6625 http://sourceforge.net/p/jump-pilot/code/6625 Author: michaudm Date: 2020-11-19 08:02:57 +0000 (Thu, 19 Nov 2020) Log Message: ----------- Fix more deeply and document the half pixel shift problem
Modified Paths: -------------- core/trunk/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImage.java core/trunk/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoReferencedRaster.java
Modified: core/trunk/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImage.java =================================================================== --- core/trunk/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImage.java 2020-11-15 17:54:16 UTC (rev 6624) +++ core/trunk/src/com/vividsolutions/jump/workbench/imagery/geoimg/GeoImage.java 2020-11-19 08:02:57 UTC (rev 6625) @@ -43,6 +43,7 @@ import java.awt.image.renderable.ParameterBlock; import java.lang.reflect.InvocationTargetException;
+import javax.media.jai.InterpolationNearest; import javax.media.jai.JAI; import javax.media.jai.RenderedOp; import javax.media.jai.operator.AffineDescriptor; @@ -147,7 +148,7 @@ // System.out.println("GI: NO SCALE CACHE");
// First, scale the original image - double scaleX = scale * gtr.getDblModelUnitsPerRasterUnit_X(); + double scaleX = scale * Math.abs(gtr.getDblModelUnitsPerRasterUnit_X()); double scaleY = scale * Math.abs(gtr.getDblModelUnitsPerRasterUnit_Y());
would you mind commenting here why Math.abs() is necessary? or pointing to a place in GeoReferencedRaster where you added some doc about it?
// calculate predicted dimensions @@ -209,7 +210,11 @@ // Interpolation interp = Interpolation // .getInstance(Interpolation.INTERP_BICUBIC); // pb.add(interp); // add interpolation method - img = JAI.create("scale", pb, hints); + //img = JAI.create("scale", pb, hints); + // Prefer affine to scale as affine uses double parameters and preserve scale signus + // while scale uses float parameters and forbid negative scaleY + AffineTransform tr = new AffineTransform(scaleX_toUse, 0, 0, scaleY_toUse, 0, 0); + img = JAI.create("affine", scale_src_img, tr, new InterpolationNearest()); } else { pb.add(scaleX_toUse); pb.add(scaleY_toUse); @@ -270,9 +275,9 @@ raster_cropX = Math.min((float)raster_cropX, (float)img.getWidth()); raster_cropY = Math.min((float)raster_cropY, (float)img.getHeight()); raster_cropW = Math - .min((float)raster_cropW, (float)img.getWidth() - /*(int)*/ raster_cropX); - raster_cropH = Math.min((float)raster_cropH, (float)img.getHeight() - - /*(int)*/ raster_cropY); + .min((float)raster_cropW, (float)(img.getWidth() - raster_cropX)); + raster_cropH = Math.min((float)raster_cropH, (float)(img.getHeight() + - raster_cropY));
pb = new ParameterBlock(); pb.addSource(img); @@ -282,8 +287,11 @@ //System.out.println("croph " + (float)raster_cropH + " " + (img.getHeight() - /*(int)*/ raster_cropY)); pb.add((float)raster_cropX); pb.add((float)raster_cropY); - pb.add((float)raster_cropW); - pb.add((float)raster_cropH); + // conversions of cropX/Y and width/height from double to float may + // create an envelope slightly outside the real envelope of the image + // removing ulp to the width/height solve the problem + pb.add((float)raster_cropW-Math.ulp((float)raster_cropW)); + pb.add((float)raster_cropH-Math.ulp((float)raster_cropH)); img = JAI.create("crop", pb, null);
nifty. reading your eplpanation it makes total sense now :)
..ede
_______________________________________________ Jump-pilot-devel mailing list Jump-pilot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel
|