Загрузка изображений JPEG2000 с использованием JAI - PullRequest
0 голосов
/ 21 декабря 2018

Я хочу загрузить изображение 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.

Это способ 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();
    }
}

Однако переменное изображение не содержит никаких данных: Empty object Метод 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 Ответ

0 голосов
/ 08 января 2019

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

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

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

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

...