1

我必须将 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);

有什么新想法吗?

4

1 回答 1

1

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

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

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

于 2012-10-19T12:52:05.310 回答