web-dev-qa-db-ja.com

Java ImageIO標準ライブラリを使用してTIFF画像ファイルを読み書きできない

TIFFイメージの処理方法がわかりませんが、ストレートJava標準のImageIOライブラリを使用してそれらを読み書きすることはできません。何かご意見はありますか?

ありがとう。

22
Gle

何らかの理由でJAIが気に入らない、または使用できない場合は、ImageIO用のTIFF ImageReaderプラグインを作成しました。これは GitHub から入手できます。これは純粋なJavaであり、ネイティブインストールを必要とせず、非常に使いやすいオープンソースライセンス(BSD)が付属しています。

これは、多くの標準拡張機能とともに、任意のベースラインTIFFオプションをサポートします。バージョン3.1以降、TIFFプラグインも書き込みサポートを備えています。

クラスパスに適切なJARがあれば、次のように簡単に使用できます。

BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);
14
haraldK

JEP 262:TIFF Image I/O によれば、JAIの一部であったTIFFプラグインは、Java SEの一部としてJavaから利用できるようになります9。

つまり、Java 9以降を使用すると、追加のインポートや依存関係がなくても次のコードが機能します。

BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);

このプラグインで非ベースラインTIFFフレーバーのサポートを確認することはまだできていませんが、少なくともベースラインTIFFは完全にサポートされているはずです。

5
haraldK

JAIを試しましたが、うまくいきませんでした。

どこに行き詰まっていますか?以下はあなたのために働きますか?

import Java.io.File;
import Java.io.FileOutputStream;
import Java.awt.image.RenderedImage;
import com.Sun.image.codec.jpeg.JPEGCodec;
import com.Sun.image.codec.jpeg.JPEGImageEncoder;
import javax.media.jai.NullOpImage;
import javax.media.jai.OpImage;
import com.Sun.media.jai.codec.SeekableStream;
import com.Sun.media.jai.codec.FileSeekableStream;
import com.Sun.media.jai.codec.TIFFDecodeParam;
import com.Sun.media.jai.codec.ImageDecoder;
import com.Sun.media.jai.codec.ImageCodec;

public class Main {
    public static void main(String args[]) {
        File file = new File("input.tif");
        try {
            SeekableStream s = new FileSeekableStream(file);
            TIFFDecodeParam param = null;
            ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
            RenderedImage op = new NullOpImage(dec.decodeAsRenderedImage(0),
                                               null,
                                               OpImage.OP_IO_BOUND,
                                               null);
            FileOutputStream fos = new FileOutputStream("output.jpg");
            JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(fos);
            jpeg.encode(op.getData());
            fos.close();
        }
        catch (Java.io.IOException ioe) {
            System.out.println(ioe);
        } 
    }
}
4
MPG