Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将TIFF转换为JPEG在linux中不起作用-无法为此操作渲染Renderop_Java_Linux_Jpeg_Tiff_Jai - Fatal编程技术网

Java 将TIFF转换为JPEG在linux中不起作用-无法为此操作渲染Renderop

Java 将TIFF转换为JPEG在linux中不起作用-无法为此操作渲染Renderop,java,linux,jpeg,tiff,jai,Java,Linux,Jpeg,Tiff,Jai,我必须将tif文件转换为jpeg(尽管我意识到将tif转换为任何扩展名也会失败)。我的代码在本地windows计算机上正常工作,但在我的开发环境(CentOs计算机)上不工作。这是我的代码(如您所见,非常简单): 此代码在windows中运行良好,但当我尝试在linux上执行时,会出现以下错误: Caused by: java.lang.RuntimeException: - Unable to render RenderedOp for this operation. at javax

我必须将tif文件转换为jpeg(尽管我意识到将tif转换为任何扩展名也会失败)。我的代码在本地windows计算机上正常工作,但在我的开发环境(CentOs计算机)上不工作。这是我的代码(如您所见,非常简单):

此代码在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)
如果我调试应用程序,试图了解有关异常的更多信息,我只知道导致异常的原因是“无法呈现此操作的RenderOp”

为了解决这个问题,我尝试了不同版本的OracleJDK/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;
}

有什么新想法吗?

我不认为所有的JRE实现(比如OpenJDK)都包含默认情况下可以在JAI中使用的Jpeg编码器。我不知道这是不是你的问题。无论如何,通过使用JAI图像IO工具扩展,您可能会获得更好的成功:

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


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

我认为JRE的所有实现(如OpenJDK)都不包括默认情况下可以在JAI中使用的JPEG编码器。我不知道这是不是你的问题。无论如何,通过使用JAI图像IO工具扩展,您可能会获得更好的成功:

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


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

您是否在linux上使用OpenJDK或Oracle JDK?对于使用许可编解码器的特定TIFF,这可能是一个特定问题吗?libtiff只支持开放规范的编解码器。嗨,史蒂夫,谢谢你的评论。我使用的TIFF压缩是“旧JPEG(在TIFF中)”。我要试试看这个编解码器是否有许可证。谢谢!您是否在linux上使用OpenJDK或Oracle JDK?对于使用许可编解码器的特定TIFF,这可能是一个特定问题吗?libtiff只支持开放规范的编解码器。嗨,史蒂夫,谢谢你的评论。我使用的TIFF压缩是“旧JPEG(在TIFF中)”。我要试试看这个编解码器是否有许可证。谢谢!谢谢你的评论。我只使用过Oracle JDK/JRE发行版。我现在使用的是jdk1.6_20。关于ImageIO,我也使用这个API进行了测试,但它也不起作用(在windows中起作用,但在linux中不起作用)。我已经用这两个问题和我在ImageIO中使用的代码更新了这个问题。谢谢你的评论。我只使用过Oracle JDK/JRE发行版。我现在使用的是jdk1.6_20。关于ImageIO,我也使用这个API进行了测试,但它也不起作用(在windows中起作用,但在linux中不起作用)。我已经用这两个问题和我在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;
}
BufferedImage image = ImageIO.read(tiffFile);