This is an automated email from the ASF dual-hosted git repository. kinow pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-imaging.git
commit 00c2f34f13c7ad2d06aa38dd4659fbd5fb82adb8 Author: gwlucastrig <[email protected]> AuthorDate: Wed Aug 12 18:48:20 2020 -0400 [IMAGING-263]: Correction for indexing in partial raster --- .../formats/tiff/datareaders/DataReaderTiled.java | 7 +- .../formats/tiff/TiffFloatingPointReadTest.java | 100 ++++++++++++++------- 2 files changed, 69 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/apache/commons/imaging/formats/tiff/datareaders/DataReaderTiled.java b/src/main/java/org/apache/commons/imaging/formats/tiff/datareaders/DataReaderTiled.java index da11b01..9b8903b 100644 --- a/src/main/java/org/apache/commons/imaging/formats/tiff/datareaders/DataReaderTiled.java +++ b/src/main/java/org/apache/commons/imaging/formats/tiff/datareaders/DataReaderTiled.java @@ -324,17 +324,14 @@ public final class DataReaderTiled extends ImageDataReader { final int nColumnsOfTiles = (width + tileWidth - 1) / tileWidth; - final int x0 = col0 * tileWidth; - final int y0 = row0 * tileLength; - for (int iRow = row0; iRow <= row1; iRow++) { for (int iCol = col0; iCol <= col1; iCol++) { final int tile = iRow * nColumnsOfTiles + iCol; final byte[] compressed = imageData.tiles[tile].getData(); final byte[] decompressed = decompress(compressed, compression, bytesPerTile, tileWidth, tileLength); - int x = iCol * tileWidth - x0; - int y = iRow * tileLength - y0; + int x = iCol * tileWidth; + int y = iRow * tileLength; int[] blockData = unpackFloatingPointSamples( tileWidth, tileLength, tileWidth, decompressed, diff --git a/src/test/java/org/apache/commons/imaging/formats/tiff/TiffFloatingPointReadTest.java b/src/test/java/org/apache/commons/imaging/formats/tiff/TiffFloatingPointReadTest.java index 12977e7..a73bf2e 100644 --- a/src/test/java/org/apache/commons/imaging/formats/tiff/TiffFloatingPointReadTest.java +++ b/src/test/java/org/apache/commons/imaging/formats/tiff/TiffFloatingPointReadTest.java @@ -124,7 +124,6 @@ public class TiffFloatingPointReadTest { @Test public void test() { Map<String, Object> params = new HashMap<>(); - // These TIFF sample data includes files that contain known // floating-point values in various formats. We know the range // of values from inspection using separate utilies. This @@ -134,6 +133,7 @@ public class TiffFloatingPointReadTest { // code in the tabulation. If you have a file that does not // define a no-data value, just use Float.NaN for testing purposes. try { + // Test the satellite-derived cloud imagery file ----------------------------- // We know from inspection that this sample file contains values // in the range 0 to 1 and uses 9999 as a "no-data" value. File target = getTiffFile("Sample64BitFloatingPointPix451x337.tiff"); @@ -143,34 +143,43 @@ public class TiffFloatingPointReadTest { } float minVal = pInterp.getMinFound(); float maxVal = pInterp.getMaxFound(); - boolean testCondition = 0.0 <= minVal && minVal <= 1.0 && 0.0 <= maxVal && maxVal <= 1.0; assertTrue(testCondition, "Min,Max values not in range 0 to 1: " + minVal + ", " + maxVal); assertTrue(minVal <= maxVal, "Min Value not <= maxVal: " + minVal + ", " + maxVal); // To test the sub-image logic, read the full raster and then - // the sub-raster. Compare the results. The offsets of - // 17 are just an arbitrary value not likely to align with - // any arbitrary features in the TIFF files. - params.clear(); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_X, 17); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_Y, 17); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_WIDTH, 200); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_HEIGHT, 200); + // the sub-raster. Compare the results. We know from inspection + // that the source file is organized using strips of 2 rows each. + // The source file is of dimensions 451x337. + // The dimensions of the sub-image are arbitrary TiffRasterData fullRaster = readRasterFromTIFF(target, null); - TiffRasterData partRaster = readRasterFromTIFF(target, params); - assertEquals(200, partRaster.getWidth(), "Invalid width in partial for " + target.getName()); - assertEquals(200, partRaster.getHeight(), "Invalid height in partial for " + target.getName()); - for (int y = 17; y < 217; y++) { - for (int x = 17; x < 217; x++) { - float vFull = fullRaster.getValue(x, y); - float vPart = partRaster.getValue(x - 17, y - 17); - assertEquals(vFull, vPart, "Invalid value match for partial at (" + x + "," + y + ")"); - } + int height = fullRaster.getHeight(); + int width = fullRaster.getWidth(); + // checks based on the 2-rows per strip model + checkSubImage(target, fullRaster, 17, 17, 200, 200); + checkSubImage(target, fullRaster, 1, 3, width-2, 1); + checkSubImage(target, fullRaster, 1, 3, width-2, 3); + checkSubImage(target, fullRaster, 1, 4, width-2, 1); + checkSubImage(target, fullRaster, 1, 4, width-2, 3); + // check the 4 edges + checkSubImage(target, fullRaster, 0, 0, width, 1); // bottom row + checkSubImage(target, fullRaster, 0, 0, 1, height); // left column + checkSubImage(target, fullRaster, 0, height-1, width, 1); // top row + checkSubImage(target, fullRaster, width-1, 0, 1, height); // right column + + // test along the main diagnonal and a parallel that reaches the top-right corner + int s = width-height; + for(int i=0; i<height-8; i++){ + checkSubImage(target, fullRaster, i, i, 8, 8); + checkSubImage(target, fullRaster, i+1, i, 8, 8); } + + // Test the USGS overview file ------------------------------ // We know from inspection that this sample file contains values // in the range -2 to 62 and uses -99999 as a "no-data" value. + // The file is organized using tiles of size 128-by-128. + // and that the overall image size is 338-by-338. target = getTiffFile("USGS_13_n38w077_dir5.tiff"); pInterp = readAndInterpretTIFF(target, -2f, 62f, -99999f); if (pInterp == null) { @@ -182,24 +191,49 @@ public class TiffFloatingPointReadTest { assertTrue(testCondition, "Min,Max values not in range -2 to 62: " + minVal + ", " + maxVal); assertTrue(minVal <= maxVal, "Min Value not <= maxVal: " + minVal + ", " + maxVal); - params.clear(); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_X, 17); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_Y, 17); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_WIDTH, 200); - params.put(TiffConstants.PARAM_KEY_SUBIMAGE_HEIGHT, 200); fullRaster = readRasterFromTIFF(target, null); - partRaster = readRasterFromTIFF(target, params); - assertEquals(200, partRaster.getWidth(), "Invalid width in partial for " + target.getName()); - assertEquals(200, partRaster.getHeight(), "Invalid height in partial for " + target.getName()); - for (int y = 17; y < 217; y++) { - for (int x = 17; x < 217; x++) { + // The tile size for this file is 128-by-128. The following tests + // read subsections starting right before the tile transition and right after it. + height = fullRaster.getHeight(); + width = fullRaster.getWidth(); + // checks based on the 128-by-128 tile model + checkSubImage(target, fullRaster, 126, 126, 132, 132); + checkSubImage(target, fullRaster, 128, 128, 128, 128); + checkSubImage(target, fullRaster, 1, 1, width-2, height-2); + // check the 4 edges + checkSubImage(target, fullRaster, 0, 0, width, 1); // bottom row + checkSubImage(target, fullRaster, 0, 0, 1, height); // left column + checkSubImage(target, fullRaster, 0, height-1, width, 1); // top row + checkSubImage(target, fullRaster, width-1, 0, 1, height); // right column + + // now test along the main diagonal + for(int i=0; i<height-8; i++){ + checkSubImage(target, fullRaster, i, i, 8, 8); + } + } catch (ImageReadException | IOException ex) { + fail("Exception during test " + ex.getMessage()); + } + } + + + private void checkSubImage(File target, TiffRasterData fullRaster, int x0, int y0, int width, int height){ + try{ + Map<String, Object> params = new HashMap<>(); + params.put(TiffConstants.PARAM_KEY_SUBIMAGE_X, x0); + params.put(TiffConstants.PARAM_KEY_SUBIMAGE_Y, y0); + params.put(TiffConstants.PARAM_KEY_SUBIMAGE_WIDTH, width); + params.put(TiffConstants.PARAM_KEY_SUBIMAGE_HEIGHT, height); + TiffRasterData partRaster = readRasterFromTIFF(target, params); + assertEquals(width, partRaster.getWidth(), "Invalid width in partial for " + target.getName()); + assertEquals(height, partRaster.getHeight(), "Invalid height in partial for " + target.getName()); + for (int y = y0; y < y0+height; y++) { + for (int x = x0; x < x0+width; x++) { float vFull = fullRaster.getValue(x, y); - float vPart = partRaster.getValue(x - 17, y - 17); - assertEquals(vFull, vPart, "Invalid value match for partial at (" + x + "," + y + ")"); + float vPart = partRaster.getValue(x - x0, y - y0); + assertEquals(vFull, vPart, "Invalid value match for partial at (" + x + "," + y + ") for "+target.getName()); } } - - } catch (ImageReadException | IOException ex) { + }catch (ImageReadException | IOException ex) { fail("Exception during test " + ex.getMessage()); } }
