diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIF.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIF.java index e3093b39..26991295 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIF.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIF.java @@ -30,7 +30,9 @@ package com.twelvemonkeys.imageio.plugins.jpeg; import com.twelvemonkeys.imageio.metadata.jpeg.JPEG; -import java.io.*; +import java.io.DataInput; +import java.io.EOFException; +import java.io.IOException; import java.nio.ByteBuffer; /** @@ -111,7 +113,7 @@ final class JFIF extends Application { buffer.getShort() & 0xffff, x = buffer.get() & 0xff, y = buffer.get() & 0xff, - getBytes(buffer, x * y * 3), + getBytes(buffer, Math.min(buffer.remaining(), x * y * 3)), bytes ); } diff --git a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java index be3e7b28..416257cc 100644 --- a/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java +++ b/imageio/imageio-jpeg/src/main/java/com/twelvemonkeys/imageio/plugins/jpeg/ThumbnailReader.java @@ -74,8 +74,17 @@ abstract class ThumbnailReader { static protected BufferedImage readRawThumbnail(final byte[] thumbnail, final int size, final int offset, int w, int h) { DataBufferByte buffer = new DataBufferByte(thumbnail, size, offset); - WritableRaster raster = Raster.createInterleavedRaster(buffer, w, h, w * 3, 3, new int[] {0, 1, 2}, null); - ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB),false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); + WritableRaster raster; + ColorModel cm; + + if (thumbnail.length == w * h) { + raster = Raster.createInterleavedRaster(buffer, w, h, w, 1, new int[] {0}, null); + cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); + } + else { + raster = Raster.createInterleavedRaster(buffer, w, h, w * 3, 3, new int[] {0, 1, 2}, null); + cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_sRGB), false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE); + } return new BufferedImage(cm, raster, cm.isAlphaPremultiplied(), null); } diff --git a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java index 4adf6fea..318a3d83 100644 --- a/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java +++ b/imageio/imageio-jpeg/src/test/java/com/twelvemonkeys/imageio/plugins/jpeg/JFIFThumbnailReaderTest.java @@ -41,9 +41,7 @@ import java.io.IOException; import java.util.List; import static org.junit.Assert.*; -import static org.mockito.Mockito.atLeastOnce; -import static org.mockito.Mockito.inOrder; -import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.*; /** * JFIFThumbnailReaderTest @@ -78,6 +76,20 @@ public class JFIFThumbnailReaderTest extends AbstractThumbnailReaderTest { assertEquals(122, thumbnail.getHeight()); } + @Test + public void testReadNonSpecGray() throws IOException { + ThumbnailReader reader = createReader(mock(ThumbnailReadProgressListener.class), 0, 0, createStream("/jpeg/jfif-grayscale-thumbnail.jpg")); + + assertEquals(127, reader.getWidth()); + assertEquals(76, reader.getHeight()); + + BufferedImage thumbnail = reader.read(); + assertNotNull(thumbnail); + assertEquals(BufferedImage.TYPE_BYTE_GRAY, thumbnail.getType()); + assertEquals(127, thumbnail.getWidth()); + assertEquals(76, thumbnail.getHeight()); + } + @Test public void testProgressListenerRaw() throws IOException { ThumbnailReadProgressListener listener = mock(ThumbnailReadProgressListener.class); 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 fe2eeb02..cafa1570 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 @@ -97,6 +97,7 @@ public class JPEGImageReaderTest extends ImageReaderAbstractTest