繁体   English   中英

使用ImageIO编写带有图层(即分解级别)的JPEG 2000

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

好的,这是我们的问题:

我们正在尝试使用imageio将一系列黑白.tiff文件转换为jpeg2000 .jpf文件。 我们总是会看到.jpf文件,但它们通常没有指定的图层数或缩放比例。

这是我们的代码:

 //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);

这是一个奇怪的经历,因为同一代码在后续运行中的行为有所不同。 任何见解将不胜感激!

是否所有TIFF文件都具有相同的设置(颜色模型)? 当使用索引颜色或多像素打包的源图像作为输入时, J2KImageWriter.java显示分解级别被设置为(强制)为零。

Drew处在正确的轨道上,下面的代码最终为我们整理了一些东西:

 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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM