سؤال

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!

هل كانت مفيدة؟

المحلول

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.

نصائح أخرى

Drew was on the right track, and here is the code that ended up sorting things out for us:

 public void compressor(String inputFile, String outputFile) throws IOException {
    J2KImageWriteParam iwp = new J2KImageWriteParam();
    FileInputStream fis = new FileInputStream(new File(inputFile));
    BufferedImage image = ImageIO.read(fis);
    fis.close();

    if (image == null) 
    {
        System.out.println("If no registered ImageReader claims to be able to read the resulting stream");
    }

    Iterator writers = ImageIO.getImageWritersByFormatName("JPEG2000");
    String name = null;
    ImageWriter writer = null;
    while (name != "com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageWriter") {
        writer = (ImageWriter) writers.next();
        name = writer.getClass().getName();
        System.out.println(name);
    }
    File f = new File(outputFile);
    long s = System.currentTimeMillis();
    ImageOutputStream ios = ImageIO.createImageOutputStream(f);
    writer.setOutput(ios);
    J2KImageWriteParam param = (J2KImageWriteParam) writer.getDefaultWriteParam();
    IIOImage ioimage = new IIOImage(image, null, null);
    param.setSOP(true);
    param.setWriteCodeStreamOnly(true);
    param.setProgressionType("layer");
    param.setLossless(false);
    param.setCompressionMode(J2KImageWriteParam.MODE_EXPLICIT);
    param.setCompressionType("JPEG2000");
    param.setCompressionQuality(0.1f);
    param.setEncodingRate(1.01);
    param.setFilter(J2KImageWriteParam.FILTER_97);


    writer.write(null, ioimage, param);
    System.out.println(System.currentTimeMillis() - s);
    writer.dispose();
    ios.flush();
    ios.close();

    image.flush();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top