0

我想使用 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 或任何其他提供的库?你的代码是什么样的?

4

1 回答 1

2

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

JPEG 2000 文件格式基于ISO 基本媒体文件格式 (ISO BMFF),这是一种由数据“框”组成的容器格式。您的特定 JPEG 2000 文件似乎包含 JJ2000 的原始作者(JAI 和大多数(如果不是全部)基于 Java 的解码器所基于的 Java JPEG 2000 参考实现)的“盒子”类型(具有扩展长度的盒子)懒得支持(或者,这种类型的框在文件的这一部分中是不允许的,我还没有详细阅读规范)。

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

由于 ISO BMFF 有很好的文档记录,因此可以修复或修补 JAIFileFormatReader类以支持这些扩展框。

于 2019-01-08T16:14:30.753 回答