Использование ImageIO для преобразования из JPEG2000 в PNG

Я пытаюсь преобразовать изображение JPEG2000 (.jp2) в другие форматы (JPEG или PNG), поэтому я пытаюсь использовать метод записи пакета javax.imageio. Это прекрасно работает для других форматов (например, из JPEG в PNG), но когда дело доходит до JPEG2000 (или TIFF), возникает исключение. Может ли кто-нибудь сказать мне, каковы возможные форматы входного изображения?

Exception in thread "main" java.lang.IllegalArgumentException: im == null!
    at javax.imageio.ImageIO.write(ImageIO.java:1457)
    at javax.imageio.ImageIO.write(ImageIO.java:1565)
    at decodeincodeimages.AndroidInterface.convertFormat(AndroidInterface.java:199)
    at Main_package.Execute.main(Execute.java:69)

Java Result: 1

И это метод:

public static boolean convertFormat(String inputImagePath,
        String outputImagePath, String formatName) throws IOException {
    FileInputStream inputStream = new FileInputStream(inputImagePath);
    FileOutputStream outputStream = new FileOutputStream(outputImagePath);

    // reads input image from file
    BufferedImage inputImage = ImageIO.read(inputStream);

    // writes to the output image in specified format
    boolean result = ImageIO.write(inputImage, formatName, outputStream);

    // needs to close the streams
    outputStream.close();
    inputStream.close();

    return result;
}

И я называю это так:

System.out.println(AndroidInterface.convertFormat("g:\\picture.jp2","g:\\conv.gif", "gif"));

person amine khelifa    schedule 19.05.2016    source источник
comment
возможно, вам нужно увидеть этот пост blog.idrsolutions.com /2015/04/how-to-read-jpeg2000-in-java   -  person David Hackro    schedule 05.12.2016


Ответы (2)


ImageIO поставляется со следующими встроенными форматами: BMP, GIF, JPEG, PNG, WBMP (источник: документацию по API). Если вы попытаетесь прочитать изображение в другом формате, методы ImageIO.read(...) просто вернут null, поэтому вы получите IllegalArgumentException: im == null позже в своем методе.

Однако ImageIO также использует механизм подключаемых модулей (интерфейс поставщика услуг или SPI), позволяющий устанавливать дополнительные или сторонние подключаемые модули.

Чтобы иметь возможность читать JPEG2000 или TIFF, вам нужен такой плагин.

  • Для JPEG2000 лучшим вариантом, вероятно, является JAI. JAI также имеет плагин TIFF. JAI был разработан Sun (теперь Oracle), но, к сожалению, уже много лет не было обновлений и исправлений ошибок.

  • Существуют также привязки Java для OpenJPEG, которые должны содержать подключаемый модуль ImageIO для JPEG2000.

  • Для TIFF вы также можете использовать мой плагин TwelveMonkeys ImageIO TIFF. TwelveMonkeys в настоящее время не имеет подключаемого модуля JPEG2000, поэтому он может быть менее полезен для вас.

(Этот список не является исчерпывающим, Google может помочь вам найти больше :-))

PS: начиная с Java 9 (JEP-262) и более поздних версий также встроена поддержка формата TIFF.

person Harald K    schedule 20.05.2016

Вы можете использовать imageio-openjpeg в качестве плагина для ImageIO API. (https://github.com/dbmdz/imageio-jnr)

person Horcrux7    schedule 13.09.2020