Merge remote-tracking branch 'origin/master'

This commit is contained in:
Harald Kuhr 2018-08-18 12:51:30 +02:00
commit 8579b1c5bc
6 changed files with 76 additions and 5 deletions

View File

@ -477,12 +477,13 @@ public final class TIFFUtilities {
} }
Entry compressionEntry = IFD.getEntryById(TIFF.TAG_COMPRESSION); Entry compressionEntry = IFD.getEntryById(TIFF.TAG_COMPRESSION);
Number compression = (Number) compressionEntry.getValue(); if(compressionEntry != null) {
if (compression.shortValue() == TIFFExtension.COMPRESSION_OLD_JPEG) { Number compression = (Number) compressionEntry.getValue();
newIFD.remove(compressionEntry); if (compression.shortValue() == TIFFExtension.COMPRESSION_OLD_JPEG) {
newIFD.add(new TIFFEntry(TIFF.TAG_COMPRESSION, TIFF.TYPE_SHORT, TIFFExtension.COMPRESSION_JPEG)); newIFD.remove(compressionEntry);
newIFD.add(new TIFFEntry(TIFF.TAG_COMPRESSION, TIFF.TYPE_SHORT, TIFFExtension.COMPRESSION_JPEG));
}
} }
return newIFD; return newIFD;
} }

View File

@ -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<TIFFUtilities.TIFFPage> 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) { protected URL getClassLoaderResource(final String pName) {
return getClass().getResource(pName); return getClass().getResource(pName);
} }

View File

@ -69,6 +69,12 @@ public final class PICTImageReaderSpi extends ImageReaderSpiBase {
else { else {
// Skip header 512 bytes for file-based streams // Skip header 512 bytes for file-based streams
stream.reset(); 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); skipNullHeader(stream);
} }

View File

@ -7,6 +7,7 @@ import java.awt.color.ColorSpace;
import java.awt.image.ComponentColorModel; import java.awt.image.ComponentColorModel;
import java.awt.image.ComponentSampleModel; import java.awt.image.ComponentSampleModel;
import java.awt.image.SampleModel; import java.awt.image.SampleModel;
import java.awt.image.WritableRaster;
/** /**
* ExtraSamplesColorModel. * ExtraSamplesColorModel.
@ -41,4 +42,19 @@ final class ExtraSamplesColorModel extends ComponentColorModel {
// Must have the same number of components // Must have the same number of components
return numComponents == sm.getNumBands() && transferType == sm.getTransferType(); 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);
}
} }

View File

@ -40,6 +40,7 @@ import javax.imageio.stream.ImageInputStream;
import java.awt.*; import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.Raster; import java.awt.image.Raster;
import java.awt.image.WritableRaster;
import java.io.IOException; import java.io.IOException;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.Arrays; import java.util.Arrays;
@ -586,6 +587,25 @@ public class TIFFImageReaderTest extends ImageReaderAbstractTest<TIFFImageReader
} }
} }
@Test
public void testAlphaRasterForMultipleExtraSamples() throws IOException {
ImageReader reader = createReader();
try (ImageInputStream stream = ImageIO.createImageInputStream(getClassLoaderResource("/tiff/extra-channels.tif"))) {
reader.setInput(stream);
BufferedImage image = reader.read(0);
assertNotNull(image);
assertEquals(0x00, image.getRGB(0, 0));
assertEquals(0xf5, (image.getRGB(50, 50) & 0xff000000) >>> 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 @Test
public void testReadWithSubsampleParamPixelsJPEG() throws IOException { public void testReadWithSubsampleParamPixelsJPEG() throws IOException {
// Tiled "new style" JPEG // Tiled "new style" JPEG