我想使用 Java JAI 加载 jpeg2000 图像 (.jp2)。
我已经在使用仍然支持 jpeg2000 的旧 JAI 版本。我从 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(); } }
但是变量 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 或任何其他提供的库?你的代码是什么样的?