Загрузка изображений JPEG2000 с использованием JAI

Я хочу загрузить изображение jpeg2000 (.jp2) с помощью Java JAI.

Я уже использую более старую версию JAI, которая все еще поддерживает jpeg2000. Я скачал эти изображения с scihub.copernicus.eu. Эти файлы довольно большие (до 100 МБ). Я пробовал несколько разных подходов:

  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

Я ожидал получить BufferedImage файла JPEP2000.

  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 или любым другим? Как выглядит ваш код?

1 ответ

Я думаю, что "проблема" - это конкретные файлы, которые вы пытаетесь прочитать. И дело не в том, что размер файла слишком велик, а в размере одного из блоков.

Формат файла JPEG 2000 основан на базовом формате медиафайлов ISO (ISO BMFF), который является контейнерным форматом, состоящим из "блоков" данных. Кажется, что ваш конкретный файл JPEG 2000 содержит тип "box" (блок с увеличенной длиной), на котором основаны авторы JJ2000 (эталонная реализация Java JPEG 2000, на которой основан JAI и большинство, если не все, декодеры на основе Java) не удосужился поддержать (альтернативно, этот тип ящика не разрешен в этой части файла, я не читал спецификацию в таких деталях).

Возможно, вам повезет больше с родными плагинами JAI для JPEG 2000 или другой (нативной) реализацией.

Поскольку ISO BMFF хорошо документирован, может быть возможно исправить или исправить JAI FileFormatReader класс для поддержки этих расширенных коробок.

Другие вопросы по тегам