#358 Now passes compression quality on to the JPEGImageWriter delegate

This commit is contained in:
Harald Kuhr 2017-12-19 20:34:02 +01:00
parent 910f9fafc7
commit 8a3b8c4c03
2 changed files with 54 additions and 5 deletions

View File

@ -359,7 +359,7 @@ public final class TIFFImageWriter extends ImageWriterBase {
ListenerDelegate listener = new ListenerDelegate(imageIndex); ListenerDelegate listener = new ListenerDelegate(imageIndex);
jpegWriter.addIIOWriteProgressListener(listener); jpegWriter.addIIOWriteProgressListener(listener);
jpegWriter.addIIOWriteWarningListener(listener); jpegWriter.addIIOWriteWarningListener(listener);
jpegWriter.write(renderedImage); jpegWriter.write(null, image, copyParams(param, jpegWriter));
} }
finally { finally {
jpegWriter.dispose(); jpegWriter.dispose();
@ -394,6 +394,27 @@ public final class TIFFImageWriter extends ImageWriterBase {
return nextIFDPointerOffset; 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 // TODO: Candidate util method
private int computePixelSize(final SampleModel sampleModel) { private int computePixelSize(final SampleModel sampleModel) {
int size = 0; int size = 0;

View File

@ -322,10 +322,11 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase {
new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB), new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB),
new BufferedImage(110, 100, BufferedImage.TYPE_INT_RGB), new BufferedImage(110, 100, BufferedImage.TYPE_INT_RGB),
new BufferedImage(120, 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++) { for (int i = 0; i < images.length; i++) {
BufferedImage image = images[i]; BufferedImage image = images[i];
@ -350,18 +351,21 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase {
try { try {
writer.prepareWriteSequence(null); writer.prepareWriteSequence(null);
params.setCompressionType("JPEG"); params.setCompressionType("LZW");
writer.writeToSequence(new IIOImage(images[0], null, null), params); writer.writeToSequence(new IIOImage(images[0], null, null), params);
params.setCompressionType("None"); params.setCompressionType("None");
writer.writeToSequence(new IIOImage(images[1], null, null), params); writer.writeToSequence(new IIOImage(images[1], null, null), params);
params.setCompressionType("None"); params.setCompressionType("JPEG");
writer.writeToSequence(new IIOImage(images[2], null, null), params); writer.writeToSequence(new IIOImage(images[2], null, null), params);
params.setCompressionType("PackBits"); params.setCompressionType("PackBits");
writer.writeToSequence(new IIOImage(images[3], null, null), params); 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(); writer.endWriteSequence();
} }
catch (IOException e) { 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 @Test
public void testReadWriteRead1BitLZW() throws IOException { public void testReadWriteRead1BitLZW() throws IOException {
// Read original LZW compressed TIFF // Read original LZW compressed TIFF