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

_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to