【问题标题】:Loading JPEG2000 Images using JAI使用 JAI 加载 JPEG2000 图像
【发布时间】:2018-12-21 08:59:17
【问题描述】:

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

我已经在使用仍然支持 jpeg2000 的旧 JAI 版本。我从 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();
        }
    }
    

但是变量 image 不包含任何数据: 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 或任何其他提供的库?你的代码是什么样的?

【问题讨论】:

标签: java jai jpeg2000 sentinel2


【解决方案1】:

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

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 类以支持这些扩展框。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多