Merging TIFF pages failed, if a page contained a sub IFD without a TIFF.TAG_COMPRESSION entry

This commit is contained in:
Oliver Schmidtmer 2018-07-09 16:42:34 +02:00
parent 7cb1c6811a
commit 18800b6ee4
2 changed files with 34 additions and 5 deletions

View File

@ -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;
}

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) {
return getClass().getResource(pName);
}