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 に答える