Search code examples
javajavax.imageiojpeg2000

Using ImageIO to write JPEG 2000 with layers (i.e. decomposition levels)


Ok, here is our issue:

We are trying to convert a series of black and white .tiff files into jpeg2000 .jpf files, using imageio. We are always getting viewable .jpf files, but they usually do not have the specified number of layers or decomposition levels for zooming.

Here is our code:

 //Get the tiff reader
 Iterator<ImageReader> readerIterator = ImageIO.getImageReadersByFormatName("tiff");
 ImageReader tiffreader = readerIterator.next();

 //make an ImageInputStream from our tiff file and have the tiff reader read it
 ImageInputStream iis = ImageIO.createImageInputStream(itemFile);

 tiffreader.setInput(iis);

 //just pass empty params to the tiff reader
 ImageReadParam tparam;
 tparam = new TIFFImageReadParam();

 IIOImage img = tiffreader.readAll(0, tparam);


 //set up target file
 File f = new File(itemTargetDirectory.getAbsolutePath() + "/" + destFileName);

 //we have tried FILTER_97 as well as different ProgressionTypes and compression settings
 J2KImageWriteParam param;
 param = new J2KImageWriteParam();
 param.setProgressionType("layer");
 param.setFilter(J2KImageWriteParam.FILTER_53);
 //Our problem is that this param is not always respected in the resulting .jpf
 param.setNumDecompositionLevels(5);

 //get the JPEG 2000 writer                             
 Iterator<ImageWriter> writerIterator = ImageIO.getImageWritersByFormatName("JPEG 2000");
 J2KImageWriter jp2kwriter = null;
 jp2kwriter = (J2KImageWriter) writerIterator.next();

 //write the jpf file
 ImageOutputStream ios = ImageIO.createImageOutputStream(f);
 jp2kwriter.setOutput(ios);
 jp2kwriter.write(null, img, param);

It has been an odd experience, as the same code has behaved differently on subsequent runs. Any insights will be appreciated!


Solution

  • Do all the TIFF files have the same settings (color model)? J2KImageWriter.java shows the decomposition levels getting set (forced) to zero when indexed-color or multi-pixel packed source images are used as input.