我必须将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);
有任何新想法吗?
答案 0 :(得分:1)
我认为JRE的所有实现(例如OpenJDK)都不包含可在JAI中默认使用的Jpeg编码器。我不知道这是不是你的问题。无论如何,使用JAI Image IO Tools扩展程序可能会获得更好的成功:
这提供了集成,允许JAI使用ImageIO库进行图像解码/编码,这通常比原始JAI处理有很大改进。
要进一步调试您的问题,您可以尝试临时输出JPEG以外的图像格式,以查看您的问题是否特定于JPEG编码。