From b30d454bf05cd3ce233032eff8a16906fc876e94 Mon Sep 17 00:00:00 2001 From: Oliver Schmidtmer Date: Tue, 13 Jun 2017 16:55:55 +0200 Subject: [PATCH] Support merging and splitting of tiled TIFF pages --- .../contrib/tiff/TIFFUtilities.java | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 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 195df287..c132997f 100644 --- a/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java +++ b/contrib/src/main/java/com/twelvemonkeys/contrib/tiff/TIFFUtilities.java @@ -326,9 +326,6 @@ public final class TIFFUtilities { } private List writeDirectoryData(Directory IFD, ImageOutputStream outputStream) throws IOException { - //TODO support tiles - Validate.isTrue(IFD.getEntryById(TIFF.TAG_TILE_BYTE_COUNTS) == null, "Tiled TIFFs are not supported"); - Validate.isTrue(IFD.getEntryById(TIFF.TAG_TILE_OFFSETS) == null, "Tiled TIFFs are not supported"); ArrayList newIFD = new ArrayList(); Iterator it = IFD.iterator(); @@ -346,13 +343,22 @@ public final class TIFFUtilities { long[] offsets = new long[0]; long[] byteCounts = new long[0]; int[] newOffsets = new int[0]; - + boolean useTiles = false; Entry stripOffsetsEntry = IFD.getEntryById(TIFF.TAG_STRIP_OFFSETS); Entry stripByteCountsEntry = IFD.getEntryById(TIFF.TAG_STRIP_BYTE_COUNTS); if (stripOffsetsEntry != null && stripByteCountsEntry != null) { offsets = getValueAsLongArray(stripOffsetsEntry); byteCounts = getValueAsLongArray(stripByteCountsEntry); } + else { + stripOffsetsEntry = IFD.getEntryById(TIFF.TAG_TILE_OFFSETS); + stripByteCountsEntry = IFD.getEntryById(TIFF.TAG_TILE_BYTE_COUNTS); + if (stripOffsetsEntry != null && stripByteCountsEntry != null) { + offsets = getValueAsLongArray(stripOffsetsEntry); + byteCounts = getValueAsLongArray(stripByteCountsEntry); + useTiles = true; + } + } boolean rearrangedByteStrips = false; Entry oldJpegData = IFD.getEntryById(TIFF.TAG_JPEG_INTERCHANGE_FORMAT); @@ -376,9 +382,9 @@ public final class TIFFUtilities { writeData(offsets, byteCounts, outputStream); newIFD.remove(stripOffsetsEntry); - newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_OFFSETS, newOffsets)); + newIFD.add(new TIFFEntry(useTiles ? TIFF.TAG_TILE_OFFSETS : TIFF.TAG_STRIP_OFFSETS, newOffsets)); newIFD.remove(stripByteCountsEntry); - newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_BYTE_COUNTS, new int[]{ (int) (jpegByteCounts[0] + byteCounts[0])})); + newIFD.add(new TIFFEntry(useTiles ? TIFF.TAG_TILE_BYTE_COUNTS : TIFF.TAG_STRIP_BYTE_COUNTS, new int[]{ (int) (jpegByteCounts[0] + byteCounts[0])})); newIFD.remove(oldJpegData); newIFD.remove(oldJpegDataLength); @@ -426,9 +432,9 @@ public final class TIFFUtilities { } newIFD.remove(stripOffsetsEntry); - newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_OFFSETS, newOffsets)); + newIFD.add(new TIFFEntry(useTiles ? TIFF.TAG_TILE_OFFSETS : TIFF.TAG_STRIP_OFFSETS, newOffsets)); newIFD.remove(stripByteCountsEntry); - newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_BYTE_COUNTS, newByteCounts)); + newIFD.add(new TIFFEntry(useTiles ? TIFF.TAG_TILE_BYTE_COUNTS : TIFF.TAG_STRIP_BYTE_COUNTS, newByteCounts)); newIFD.remove(oldJpegData); newIFD.remove(oldJpegDataLength); @@ -441,7 +447,7 @@ public final class TIFFUtilities { newOffsets = writeData(offsets, byteCounts, outputStream); newIFD.remove(stripOffsetsEntry); - newIFD.add(new TIFFEntry(TIFF.TAG_STRIP_OFFSETS, newOffsets)); + newIFD.add(new TIFFEntry(useTiles ? TIFF.TAG_TILE_OFFSETS : TIFF.TAG_STRIP_OFFSETS, newOffsets)); } Validate.isTrue(oldJpegData == null || !newIFD.contains(oldJpegData), "Failed to transform old-style JPEG");