From 099dbb00731ef290365e747a8d1f825cf73247a7 Mon Sep 17 00:00:00 2001 From: Oliver Schmidtmer Date: Tue, 3 May 2016 13:13:00 +0200 Subject: [PATCH] TIFFPage.write did not expect subIFDs which do not contain image data --- .../contrib/tiff/TIFFUtilities.java | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) 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 948fc36f..d1b57623 100644 --- a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java +++ b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java @@ -328,28 +328,34 @@ public class TIFFUtilities { Entry e = it.next(); if (e.getValue() instanceof Directory) { List subIFD = writeDirectoryData((Directory) e.getValue(), outputStream); - new TIFFEntry((Integer) e.getIdentifier(), new AbstractDirectory(subIFD) { + new TIFFEntry((Integer) e.getIdentifier(), TIFF.TYPE_IFD, new AbstractDirectory(subIFD) { }); } newIFD.add(e); } + long[] offsets = new long[0]; + long[] byteCounts = new long[0]; + int[] newOffsets = new int[0]; + Entry stripOffsetsEntry = IFD.getEntryById(TIFF.TAG_STRIP_OFFSETS); - long[] offsets = getValueAsLongArray(stripOffsetsEntry); + Entry stripByteCountsEntry = IFD.getEntryById(TIFF.TAG_STRIP_BYTE_COUNTS); + if (stripOffsetsEntry != null && stripByteCountsEntry != null) { + offsets = getValueAsLongArray(stripOffsetsEntry); + byteCounts = getValueAsLongArray(stripByteCountsEntry); - Entry stipByteCountsEntry = IFD.getEntryById(TIFF.TAG_STRIP_BYTE_COUNTS); - long[] byteCounts = getValueAsLongArray(stipByteCountsEntry); + newOffsets = writeData(offsets, byteCounts, outputStream); - int[] newOffsets = writeData(offsets, byteCounts, outputStream); - - newIFD.remove(stripOffsetsEntry); - newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_OFFSETS, newOffsets)); + newIFD.remove(stripOffsetsEntry); + newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_OFFSETS, newOffsets)); + } Entry oldJpegData = IFD.getEntryById(TIFF.TAG_JPEG_INTERCHANGE_FORMAT); Entry oldJpegDataLength = IFD.getEntryById(TIFF.TAG_JPEG_INTERCHANGE_FORMAT_LENGTH); if (oldJpegData != null && oldJpegData.valueCount() > 0 && oldJpegDataLength != null && oldJpegDataLength.valueCount() > 0) { if (!Arrays.equals(getValueAsLongArray(oldJpegData), offsets) || !Arrays.equals(getValueAsLongArray(oldJpegDataLength), byteCounts)) { + // data already written from TIFF.TAG_STRIP_OFFSETS offsets = getValueAsLongArray(oldJpegData); byteCounts = getValueAsLongArray(oldJpegDataLength); newOffsets = writeData(offsets, byteCounts, outputStream);