From 8a3b8c4c0353529241a59756b5037f73a2fdae3a Mon Sep 17 00:00:00 2001 From: Harald Kuhr Date: Tue, 19 Dec 2017 20:34:02 +0100 Subject: [PATCH] #358 Now passes compression quality on to the JPEGImageWriter delegate --- .../imageio/plugins/tiff/TIFFImageWriter.java | 23 +++++++++++- .../plugins/tiff/TIFFImageWriterTest.java | 36 ++++++++++++++++--- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java index 12919024..ccb80f96 100644 --- a/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java +++ b/imageio/imageio-tiff/src/main/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriter.java @@ -359,7 +359,7 @@ public final class TIFFImageWriter extends ImageWriterBase { ListenerDelegate listener = new ListenerDelegate(imageIndex); jpegWriter.addIIOWriteProgressListener(listener); jpegWriter.addIIOWriteWarningListener(listener); - jpegWriter.write(renderedImage); + jpegWriter.write(null, image, copyParams(param, jpegWriter)); } finally { jpegWriter.dispose(); @@ -394,6 +394,27 @@ public final class TIFFImageWriter extends ImageWriterBase { return nextIFDPointerOffset; } + // TODO: Candidate util method + private ImageWriteParam copyParams(final ImageWriteParam param, final ImageWriter writer) { + if (param == null) { + return null; + } + + // Always safe + ImageWriteParam writeParam = writer.getDefaultWriteParam(); + writeParam.setSourceSubsampling(param.getSourceXSubsampling(), param.getSourceYSubsampling(), param.getSubsamplingXOffset(), param.getSubsamplingYOffset()); + writeParam.setSourceRegion(param.getSourceRegion()); + writeParam.setSourceBands(param.getSourceBands()); + + // Only if canWriteCompressed() + writeParam.setCompressionMode(param.getCompressionMode()); + if (param.getCompressionMode() == ImageWriteParam.MODE_EXPLICIT) { + writeParam.setCompressionQuality(param.getCompressionQuality()); + } + + return writeParam; + } + // TODO: Candidate util method private int computePixelSize(final SampleModel sampleModel) { int size = 0; diff --git a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java index 068575ff..a9c78ac6 100644 --- a/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java +++ b/imageio/imageio-tiff/src/test/java/com/twelvemonkeys/imageio/plugins/tiff/TIFFImageWriterTest.java @@ -322,10 +322,11 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase { new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB), new BufferedImage(110, 100, BufferedImage.TYPE_INT_RGB), new BufferedImage(120, 100, BufferedImage.TYPE_INT_RGB), - new BufferedImage(130, 100, BufferedImage.TYPE_INT_RGB) + new BufferedImage(130, 100, BufferedImage.TYPE_INT_RGB), + new BufferedImage(140, 100, BufferedImage.TYPE_BYTE_BINARY) }; - Color[] colors = new Color[] {Color.RED, Color.GREEN, Color.BLUE, Color.ORANGE}; + Color[] colors = new Color[] {Color.RED, Color.GREEN, Color.BLUE, Color.ORANGE, Color.WHITE}; for (int i = 0; i < images.length; i++) { BufferedImage image = images[i]; @@ -350,18 +351,21 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase { try { writer.prepareWriteSequence(null); - params.setCompressionType("JPEG"); + params.setCompressionType("LZW"); writer.writeToSequence(new IIOImage(images[0], null, null), params); params.setCompressionType("None"); writer.writeToSequence(new IIOImage(images[1], null, null), params); - params.setCompressionType("None"); + params.setCompressionType("JPEG"); writer.writeToSequence(new IIOImage(images[2], null, null), params); params.setCompressionType("PackBits"); writer.writeToSequence(new IIOImage(images[3], null, null), params); + params.setCompressionType("CCITT T.6"); + writer.writeToSequence(new IIOImage(images[4], null, null), params); + writer.endWriteSequence(); } catch (IOException e) { @@ -430,6 +434,30 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase { } } + @Test + public void testWriteParamJPEGQuality() throws IOException { + ImageWriter writer = createImageWriter(); + + try (ImageOutputStream output = ImageIO.createImageOutputStream(new NullOutputStream())) { + writer.setOutput(output); + + try { + ImageWriteParam param = writer.getDefaultWriteParam(); + // Make sure that the JPEG delegation outputs the correct indexes + param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + param.setCompressionType("JPEG"); + param.setCompressionQuality(.1f); + + writer.write(null, new IIOImage(new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB), null, null), param); + + // In a perfect world, we should verify that the parameter was passed to the JPEG delegate... + } + catch (IOException e) { + fail(e.getMessage()); + } + } + } + @Test public void testReadWriteRead1BitLZW() throws IOException { // Read original LZW compressed TIFF