使用JAI

时间:2018-12-21 08:59:18

标签: java jai jpeg2000 sentinel2

我想使用Java JAI加载jpeg2000图像(.jp2)。

我已经使用了较旧的JAI版本,该版本仍支持jpeg2000。我从scihub.copernicus.eu下载了这些图像。这些文件很大(最大100 MB)。我尝试了几种不同的方法:

  1. 使用Java的标准方法如下:

    public class Main {
        public static void main(String[] args) throws IOException {
            String path = "C:\\temp\\B2.jp2";
            File inputFile = new File(path);
            Image result = ImageIO.read(inputFile);
        }
    }
    

以下堆栈跟踪会发生异常:

    Exception in thread "main" java.lang.RuntimeException: An uncaught runtime exception has occurred
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.initializeRead(J2KReadState.java:708)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.<init>(J2KReadState.java:209)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KImageReader.read(J2KImageReader.java:449)
        at javax.imageio.ImageIO.read(ImageIO.java:1448)
        at javax.imageio.ImageIO.read(ImageIO.java:1308)
        at Main.main(Main.java:16)
    Caused by: java.io.IOException: File too long.
        at jj2000.j2k.fileformat.reader.FileFormatReader.readFileFormat(FileFormatReader.java:207)
        at com.sun.media.imageioimpl.plugins.jpeg2000.J2KReadState.initializeRead(J2KReadState.java:418)
        ... 5 more

我希望获得JPEP2000文件的BufferedImage。

  1. 这是JAI加载图片的默认方式。

    public class Main {
        public static void main(String[] args) throws IOException {
            String path = "C:\\temp\\B2.jp2";
            File inputFile = new File(path);
            RenderedOp image = JAI.create("fileload", inputFile.getPath());
            Image result = image.getAsBufferedImage();
        }
    }
    

但是变量图像不包含任何数据: Empty object 方法getAsBufferedImage()引发以下异常:

Exception in thread "main" java.lang.RuntimeException: - Unable to render RenderedOp for this operation.
    at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:827)
    at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)
    at javax.media.jai.RenderedOp.getColorModel(RenderedOp.java:2242)
    at javax.media.jai.PlanarImage.getAsBufferedImage(PlanarImage.java:2498)
    at javax.media.jai.PlanarImage.getAsBufferedImage(PlanarImage.java:2546)
    at Main.main(Main.java:15)

任何其他图片格式都可以正常工作。您正在使用什么JAI库来加载JPEG2000文件?是Javax还是github或其他任何提供的库?您的代码是什么样的?

1 个答案:

答案 0 :(得分:0)

我认为“问题”是您尝试读取的特定文件。并不是太大的文件,而是“盒子”大小之一。

JPEG 2000文件格式基于ISO base media file format (ISO BMFF),这是一种由“盒子”数据组成的容器格式。您的特定JPEG 2000文件似乎包含JJ2000的原始作者(JAI和大多数(如果不是全部)基于Java的解码器所基于的Java JPEG 2000参考实现)的“框”类型(具有扩展长度的框)。 didn't bother to support(或者,在文件的这一部分中实际上不允许使用这种类型的框,我没有详细阅读规范)。

使用JPEG 2000或其他(本机)实现的本地JAI插件可能会更好。

由于ISO BMFF有充分的文档记录,因此有可能修复或修补JAI FileFormatReader类以支持这些扩展框。