我想使用Java JAI加载jpeg2000图像(.jp2)。
我已经使用了较旧的JAI版本,该版本仍支持jpeg2000。我从scihub.copernicus.eu下载了这些图像。这些文件很大(最大100 MB)。我尝试了几种不同的方法:
使用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。
这是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();
}
}
但是变量图像不包含任何数据: 方法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或其他任何提供的库?您的代码是什么样的?
答案 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
类以支持这些扩展框。