将TIFF转换为JPEG无法在linux中工作 - 无法为此操作渲染RenderedOp

时间:2012-10-19 11:52:00

标签: java linux jpeg tiff jai

我必须将tif​​文件转换为jpeg(虽然我已经意识到它也无法将tif转换为任何扩展名)。我的代码在我的本地Windows机器上正常工作,但它不适用于我的开发环境(这是一台CentOs机器)。这是我的代码(很简单,你可以看到):

public static boolean convertTIFFToJPEG(final File in, final File out) {
    try {
        final PlanarImage image = JAI.create("ImageRead", in);

        final ParameterBlockJAI storeOperation = new ParameterBlockJAI(
                    "FileStore");
        storeOperation.addSource(image);
        storeOperation.setParameter("filename", out.getPath());
        storeOperation.setParameter("format", "jpeg");
        JAI.create("FileStore", storeOperation);
    } catch (final IllegalArgumentException e) {
        return false;
    }

    return true;
}

此代码在Windows中运行良好,但是当我尝试在linux上执行它时,我收到此错误:

Caused by: 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.getRendering(RenderedOp.java:888)
    at javax.media.jai.RenderedOp.createInstance(RenderedOp.java:799)
    at javax.media.jai.RenderedOp.createRendering(RenderedOp.java:867)
    at javax.media.jai.RenderedOp.getRendering(RenderedOp.java:888)
    at javax.media.jai.JAI.createNS(JAI.java:1099)
    at javax.media.jai.JAI.create(JAI.java:973)
    at javax.media.jai.JAI.create(JAI.java:1395)
    at example.TIFFUtils.convertTIFFToJPEG(TIFFUtils.java:97)

如果我调试应用程序,试图找到更多关于异常的内容,我只能得知它的原因是“无法为此操作渲染RenderedOp”。

为了解决这个问题,我尝试了不同版本的Oracle JDK / JRE。目前我正在使用sdk1.6_20,但我也尝试了最后一个和之前的其他发行版。

另一方面,我尝试了很多方法来使用JAI和ImageIO进行相同的处理(TIFF-> JPEG)。这是我用于ImageIO的代码:

public static boolean convertTIFFToJPEG2(final File in, final File out) {
    try {
        ImageOutputStream ios = null;
        ImageWriter writer = null;

        // find an appropriate writer
        Iterator<ImageWriter> it = ImageIO.getImageWritersByFormatName(JPEG_FORMAT);
        if (it.hasNext()) {
            writer = (ImageWriter)it.next();
        } else {
            return false;
        }

        ios = ImageIO.createImageOutputStream(out);
        writer.setOutput(ios);
        JPEGImageWriteParam writeParam = new JPEGImageWriteParam(Locale.ENGLISH);

        BufferedImage image = ImageIO.read(in);
        IIOImage iioImage = new IIOImage(image , null, null);

        // write it!
        writer.write(null, iioImage, writeParam);
    } catch (final IllegalArgumentException e) {
        return false;
    } catch (IOException e) {
        return false;
    }

    return true;
}

我得到了相同的结果:它只适用于Windows,但在linux中引发异常。在这种情况下,下一条指令返回null,因此变量'image'不包含任何内容。

BufferedImage image = ImageIO.read(tiffFile);

有任何新想法吗?

1 个答案:

答案 0 :(得分:1)

我认为JRE的所有实现(例如OpenJDK)都不包含可在JAI中默认使用的Jpeg编码器。我不知道这是不是你的问题。无论如何,使用JAI Image IO Tools扩展程序可能会获得更好的成功:

这提供了集成,允许JAI使用ImageIO库进行图像解码/编码,这通常比原始JAI处理有很大改进。

要进一步调试您的问题,您可以尝试临时输出JPEG以外的图像格式,以查看您的问题是否特定于JPEG编码。