diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java index 4201691f..ba8837ea 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReader.java @@ -438,20 +438,21 @@ public class JPEGImageReader extends ImageReaderBase { // Unfortunately looping is slower than reading all at once, but // that requires 2 x memory or more, so a few steps is an ok compromise I guess try { - final int step = Math.max(1024, srcRegion.height / 10); // * param.getSourceYSubsampling(); // TODO: Using a multiple of 8 is probably a good idea for JPEG + final int step = Math.max(1024, srcRegion.height / 10); // TODO: Using a multiple of 8 is probably a good idea for JPEG final int srcMaxY = srcRegion.y + srcRegion.height; int destY = dstRegion.y; for (int y = srcRegion.y; y < srcMaxY; y += step) { int scan = Math.min(step, srcMaxY - y); - if(scan <= param.getSubsamplingYOffset()) { - param.setSourceSubsampling(param.getSourceXSubsampling(),param.getSourceYSubsampling(),param.getSubsamplingXOffset(),0); - } - // Let the progress delegator handle progress, using corrected range progressDelegator.updateProgressRange(100f * (y + scan) / srcRegion.height); + // Make sure subsampling is within bounds + if (scan <= param.getSubsamplingYOffset()) { + param.setSourceSubsampling(param.getSourceXSubsampling(), param.getSourceYSubsampling(), param.getSubsamplingXOffset(), scan - 1); + } + Rectangle subRegion = new Rectangle(srcRegion.x, y, srcRegion.width, scan); param.setSourceRegion(subRegion); Raster raster = delegate.readRaster(imageIndex, param); // non-converted diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java index a0f3a14f..7a12da6f 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JPEGImageReaderTest.java @@ -30,6 +30,7 @@ package com.twelvemonkeys.imageio.plugins.jpeg; import com.twelvemonkeys.imageio.util.ImageReaderAbstractTestCase; import org.hamcrest.core.IsInstanceOf; +import org.junit.Ignore; import org.junit.Test; import org.mockito.internal.matchers.GreaterThan; import org.w3c.dom.Element; @@ -685,6 +686,122 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTestCase