使用ImageIO将JPEG2000转换为PNG

时间:2016-05-19 10:40:56

标签: java javax.imageio jpeg2000

我试图将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"));

2 个答案:

答案 0 :(得分:4)

ImageIO内置以下格式:BMP,GIF,JPEG,PNG,WBMP(来源:the API documentation)。如果您尝试以不同的格式阅读图片,ImageIO.read(...)方法只会返回null,这就是您在方法中稍后获得IllegalArgumentException: im == null的原因。

但是,ImageIO还使用插件机制(服务提供程序接口或SPI),以允许安装额外或第三方插件。

为了能够读取JPEG2000或TIFF,您需要这样的插件。

  • 对于JPEG2000,最好的选择可能是JAI。 JAI还有一个TIFF插件。 JAI由Sun(现为Oracle)开发,但不幸的是,多年来一直没有更新和错误修复。

  • 还有OpenJPEG的Java绑定应包含JPEG2000的ImageIO插件。

  • 对于TIFF,您还可以使用我的TwelveMonkeys ImageIO TIFF插件。 TwelveMonkeys目前没有JPEG2000插件,所以对你来说可能没什么用。

(此列表并非详尽无遗,Google可能会帮助您找到更多信息:-))

答案 1 :(得分:0)

您可以将imageio-openjpeg用作ImageIO API的插件。 (https://github.com/dbmdz/imageio-jnr