我必须将 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);
有什么新想法吗?