diff --git a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java index 88b12a58..4c8a58d2 100644 --- a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java +++ b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java @@ -477,12 +477,13 @@ public final class TIFFUtilities { } Entry compressionEntry = IFD.getEntryById(TIFF.TAG_COMPRESSION); - Number compression = (Number) compressionEntry.getValue(); - if (compression.shortValue() == TIFFExtension.COMPRESSION_OLD_JPEG) { - newIFD.remove(compressionEntry); - newIFD.add(new TIFFEntry(TIFF.TAG_COMPRESSION, TIFF.TYPE_SHORT, TIFFExtension.COMPRESSION_JPEG)); + if(compressionEntry != null) { + Number compression = (Number) compressionEntry.getValue(); + if (compression.shortValue() == TIFFExtension.COMPRESSION_OLD_JPEG) { + newIFD.remove(compressionEntry); + newIFD.add(new TIFFEntry(TIFF.TAG_COMPRESSION, TIFF.TYPE_SHORT, TIFFExtension.COMPRESSION_JPEG)); + } } - return newIFD; } diff --git a/contrib/src/test/java/com/twelvemonkeys/contrib/tiff/TIFFUtilitiesTest.java b/contrib/src/test/java/com/twelvemonkeys/contrib/tiff/TIFFUtilitiesTest.java index 1b4534e9..f1a79ff6 100644 --- a/contrib/src/test/java/com/twelvemonkeys/contrib/tiff/TIFFUtilitiesTest.java +++ b/contrib/src/test/java/com/twelvemonkeys/contrib/tiff/TIFFUtilitiesTest.java @@ -233,6 +233,34 @@ public class TIFFUtilitiesTest { } } + @Test + public void testMergeWithSubIFD() throws IOException { + String testFile = "/tiff/cmyk_jpeg.tif"; + + File output = File.createTempFile("imageiotest", ".tif"); + ImageOutputStream outputStream = ImageIO.createImageOutputStream(output); + InputStream inputStream1 = getClassLoaderResource(testFile).openStream(); + ImageInputStream imageInput1 = ImageIO.createImageInputStream(inputStream1); + InputStream inputStream2 = getClassLoaderResource(testFile).openStream(); + ImageInputStream imageInput2 = ImageIO.createImageInputStream(inputStream2); + ArrayList pages = new ArrayList<>(); + pages.addAll(TIFFUtilities.getPages(imageInput1)); + pages.addAll(TIFFUtilities.getPages(imageInput2)); + TIFFUtilities.writePages(outputStream, pages); + + ImageInputStream testOutput = ImageIO.createImageInputStream(output); + ImageReader reader = ImageIO.getImageReaders(testOutput).next(); + reader.setInput(testOutput); + int numImages = reader.getNumImages(true); + for (int i = 0; i < numImages; i++) { + reader.read(i); + } + + imageInput1.close(); + imageInput2.close(); + outputStream.close(); + } + protected URL getClassLoaderResource(final String pName) { return getClass().getResource(pName); } diff --git a/imageio/imageio-pict/src/main/java/com/twelvemonkeys/imageio/plugins/pict/PICTImageReaderSpi.java b/imageio/imageio-pict/src/main/java/com/twelvemonkeys/imageio/plugins/pict/PICTImageReaderSpi.java index 1e8b7736..c19d1d8b 100755 --- a/imageio/imageio-pict/src/main/java/com/twelvemonkeys/imageio/plugins/pict/PICTImageReaderSpi.java +++ b/imageio/imageio-pict/src/main/java/com/twelvemonkeys/imageio/plugins/pict/PICTImageReaderSpi.java @@ -69,6 +69,12 @@ public final class PICTImageReaderSpi extends ImageReaderSpiBase { else { // Skip header 512 bytes for file-based streams stream.reset(); + + // If we don't mark again here, the reset call in the finally block will: + // A) do nothing + // B) eat marks created in the stream previously + stream.mark(); + skipNullHeader(stream); } diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java index 10082da7..552ddf91 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/ExtraSamplesColorModel.java @@ -7,6 +7,7 @@ import java.awt.color.ColorSpace; import java.awt.image.ComponentColorModel; import java.awt.image.ComponentSampleModel; import java.awt.image.SampleModel; +import java.awt.image.WritableRaster; /** * ExtraSamplesColorModel. @@ -41,4 +42,19 @@ final class ExtraSamplesColorModel extends ComponentColorModel { // Must have the same number of components return numComponents == sm.getNumBands() && transferType == sm.getTransferType(); } + + @Override + public WritableRaster getAlphaRaster(WritableRaster raster) { + if (hasAlpha() == false) { + return null; + } + + int x = raster.getMinX(); + int y = raster.getMinY(); + int[] band = new int[1]; + band[0] = super.getNumComponents() - 1; + return raster.createWritableChild(x, y, raster.getWidth(), + raster.getHeight(), x, y, + band); + } } diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java index 53ad946b..53f101c8 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageReaderTest.java @@ -40,6 +40,7 @@ import javax.imageio.stream.ImageInputStream; import java.awt.*; import java.awt.image.BufferedImage; import java.awt.image.Raster; +import java.awt.image.WritableRaster; import java.io.IOException; import java.nio.ByteOrder; import java.util.Arrays; @@ -586,6 +587,25 @@ public class TIFFImageReaderTest extends ImageReaderAbstractTest>> 24); + + int[] alpha = new int[1]; + WritableRaster alphaRaster = image.getAlphaRaster(); + assertEquals(0x00, alphaRaster.getPixel(0, 0, alpha)[0]); + assertEquals(0xf5, alphaRaster.getPixel(50, 50, alpha)[0]); + } + } + @Test public void testReadWithSubsampleParamPixelsJPEG() throws IOException { // Tiled "new style" JPEG diff --git a/imageio/imageio-tiff/src/test/resources/tiff/extra-channels.tif b/imageio/imageio-tiff/src/test/resources/tiff/extra-channels.tif new file mode 100755 index 00000000..d642e461 Binary files /dev/null and b/imageio/imageio-tiff/src/test/resources/tiff/extra-channels.tif differ