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);
何か新しいアイデアはありますか?