【发布时间】:2020-11-15 08:21:53
【问题描述】:
我需要一些方法来使用 Java 读取某些 JPEG 2000 图像并将它们加载到 BufferedImage 中。我一直在使用 JAI-ImageIO 来读取 JPEG 2000 图像,因为常规 ImageIO.read 不支持该格式。我首先使用图像编辑器制作了一个自定义 jp2 图像,Java 程序运行顺利并加载了图像。但这只是一个测试。真实图像大小约为 100MB。但是,每当我在它们上运行代码时,我都会收到此错误:
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 java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1468)
at java.desktop/javax.imageio.ImageIO.read(ImageIO.java:1315)
at JPEG2000Handler.getImage(JPEG2000Handler.java:18)
at JPEG2000Handler.main(JPEG2000Handler.java:13)
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)
... 6 more
它说“文件太长”。我做了一些搜索,发现这个线程Loading JPEG2000 Images using JAI,和我的问题完全相同。根据线程,问题不在于文件大小,而是 jp2 文件中的框大小(无论这意味着什么)。该线程还提供了异常https://github.com/Unidata/jj2000/blame/073c3878e4f7799e55d5ff93bc130d01c4260b6d/src/main/java/ucar/jpeg/jj2000/j2k/fileformat/reader/FileFormatReader.java#L149的来源链接,但也表示JJ2000不支持该文件。我花了数周时间拼命寻找一种使用 Java 读取 JPEG 2000 文件的方法,但没有任何效果。我已经检查了 JDeli,但它不是免费的。我只需要某种方式来加载这些文件,它甚至不必使用 JAI。
任何想法都将不胜感激,因为它似乎开始变得不可能了。
【问题讨论】:
-
您是否使用与链接问题中相同的图像?因为那些,如果它们与我从那个站点得到的样本相同,实际上并没有大盒子。嗯,他们有,但它只包含一些元数据,我假设你可以把它删掉/忽略它。
-
我不确定您的意思,但这是我正在使用的图像:drive.google.com/file/d/1fa27QT8r__PxH9aVqYFKF-xghhU7ehG8/…。我尝试使用 JAI 打开它,但它给了我上面的错误消息。
-
好吧,我可以用 github.com/Unidata/jj2000 打开它。给我一些时间,我会发布如何做到这一点。
标签: java image javax.imageio jai jpeg2000