Now throws IllegalArgumentException if attempting to write non-binary data using CCITT fax compressions.

This commit is contained in:
Harald Kuhr 2017-12-19 22:28:14 +01:00
parent 8ca3fcecca
commit 921dba89f7
2 changed files with 35 additions and 6 deletions

View File

@ -536,6 +536,10 @@ public final class TIFFImageWriter extends ImageWriterBase {
case TIFFBaseline.COMPRESSION_CCITT_MODIFIED_HUFFMAN_RLE: case TIFFBaseline.COMPRESSION_CCITT_MODIFIED_HUFFMAN_RLE:
case TIFFExtension.COMPRESSION_CCITT_T4: case TIFFExtension.COMPRESSION_CCITT_T4:
case TIFFExtension.COMPRESSION_CCITT_T6: case TIFFExtension.COMPRESSION_CCITT_T6:
if (image.getSampleModel().getNumBands() != 1 || image.getSampleModel().getSampleSize(0) != 1) {
throw new IllegalArgumentException("CCITT compressions supports 1 sample/pixel, 1 bit/sample only");
}
long option = 0L; long option = 0L;
if (compression != TIFFBaseline.COMPRESSION_CCITT_MODIFIED_HUFFMAN_RLE) { if (compression != TIFFBaseline.COMPRESSION_CCITT_MODIFIED_HUFFMAN_RLE) {

View File

@ -288,6 +288,27 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase {
assertEquals(softwareString, software.getValueAsString()); assertEquals(softwareString, software.getValueAsString());
} }
@Test(expected = IllegalArgumentException.class)
public void testWriteIncompatibleCompression() throws IOException {
ImageWriter writer = createImageWriter();
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try (ImageOutputStream output = ImageIO.createImageOutputStream(buffer)) {
writer.setOutput(output);
try {
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionType("CCITT T.6");
writer.write(null, new IIOImage(new BufferedImage(8, 8, BufferedImage.TYPE_INT_RGB), null, null), param);
fail();
}
catch (IOException e) {
fail(e.getMessage());
}
}
}
@Test @Test
public void testWriterCanWriteSequence() { public void testWriterCanWriteSequence() {
ImageWriter writer = createImageWriter(); ImageWriter writer = createImageWriter();
@ -320,14 +341,15 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase {
public void testWriteSequence() throws IOException { public void testWriteSequence() throws IOException {
BufferedImage[] images = new BufferedImage[] { BufferedImage[] images = new BufferedImage[] {
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_3BYTE_BGR),
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(140, 100, BufferedImage.TYPE_INT_ARGB),
new BufferedImage(140, 100, BufferedImage.TYPE_INT_RGB), new BufferedImage(130, 100, BufferedImage.TYPE_BYTE_GRAY),
new BufferedImage(150, 100, BufferedImage.TYPE_BYTE_BINARY) new BufferedImage(150, 100, BufferedImage.TYPE_BYTE_BINARY),
new BufferedImage(160, 100, BufferedImage.TYPE_BYTE_BINARY)
}; };
Color[] colors = new Color[] {Color.RED, Color.GREEN, Color.BLUE, Color.ORANGE, Color.PINK, Color.WHITE}; Color[] colors = new Color[] {Color.RED, Color.GREEN, Color.BLUE, Color.ORANGE, Color.PINK, Color.WHITE, Color.GRAY};
for (int i = 0; i < images.length; i++) { for (int i = 0; i < images.length; i++) {
BufferedImage image = images[i]; BufferedImage image = images[i];
@ -367,9 +389,12 @@ public class TIFFImageWriterTest extends ImageWriterAbstractTestCase {
params.setCompressionType("Deflate"); params.setCompressionType("Deflate");
writer.writeToSequence(new IIOImage(images[4], null, null), params); writer.writeToSequence(new IIOImage(images[4], null, null), params);
params.setCompressionType("CCITT T.6"); params.setCompressionType("CCITT T.4");
writer.writeToSequence(new IIOImage(images[5], null, null), params); writer.writeToSequence(new IIOImage(images[5], null, null), params);
params.setCompressionType("CCITT T.6");
writer.writeToSequence(new IIOImage(images[6], null, null), params);
writer.endWriteSequence(); writer.endWriteSequence();
} }
catch (IOException e) { catch (IOException e) {