簡體   English   中英

使用JAI加載JPEG2000圖像

[英]Loading JPEG2000 Images using JAI

我想使用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(); } } 

但是,變量圖像不包含任何數據: 空物體 方法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或其他任何提供的庫? 您的代碼是什么樣的?

我認為“問題”是您嘗試讀取的特定文件。 並不是太大的文件,而是“盒子”大小之一。

JPEG 2000文件格式基於ISO基本媒體文件格式(ISO BMFF) ,這是一種由“盒子”數據組成的容器格式。 您的特定JPEG 2000文件似乎包含JJ2000的原始作者(JAI和大多數(如果不是全部)基於Java的解碼器所基於的Java JPEG 2000參考實現)的“框”類型(具有擴展長度的框)。 不必費心去支持 (或者,在文件的這一部分中實際上不允許這種類型的框,我沒有詳細閱讀規范)。

使用JPEG 2000或其他(本機)實現的本機JAI插件可能會更好。

由於ISO BMFF有充分的文檔說明,因此有可能可以修復或打補丁JAI FileFormatReader類以支持這些擴展框。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM