web-dev-qa-db-ja.com

JavaでのTIFF画像の読み取りと書き込み

次のコードを試して、tiff画像の読み取りと書き込みのタスクを実行しました。

 // Define the source and destination file names.
 String inputFile = /images/FarmHouse.tif
 String outputFile = /images/FarmHouse.bmp

 // Load the input image.
 RenderedOp src = JAI.create("fileload", inputFile);

 // Encode the file as a BMP image.
 FileOutputStream stream =
     new FileOutputStream(outputFile);
 JAI.create("encode", src, stream, BMP, null);

 // Store the image in the BMP format.
 JAI.create("filestore", src, outputFile, BMP, null);

ただし、コードを実行すると、次のエラーメッセージが表示されます。

Caused by: Java.lang.IllegalArgumentException: Only images with either 1 or 3 bands 
can be written out as BMP files.
 at com.Sun.media.jai.codecimpl.BMPImageEncoder.encode(BMPImageEncoder.Java:123)
 at com.Sun.media.jai.opimage.EncodeRIF.create(EncodeRIF.Java:79)

この問題をどのように解決できるか考えていますか?

13
user224270

TIFFを読み込んでa BMPを出力する最も簡単な方法は、ImageIOクラスを使用することです。

BufferedImage image = ImageIO.read(inputFile);
ImageIO.write(image, "bmp", new File(outputFile));

BMPとTIFFはJREによって処理されないため、このライブラリのプラグイン。

何らかの理由でJAIImageIOを使用できない場合は、既存のコードで動作させることができますが、追加の作業を行う必要があります。ロードしているTIFF用に作成されているカラーモデルは、おそらくBMPでサポートされていないインデックスカラーモデルです。 JAI.KEY_REPLACE_INDEX_COLOR_MODELのキーを使用してレンダリングヒントを指定することにより、JAI.create( "format"、...)操作に置き換えることができます。

ファイルから読み取った画像を一時的な画像に書き込んでから、一時的な画像を書き出すことができます。

BufferedImage image = ImageIO.read(inputFile);
BufferedImage convertedImage = new BufferedImage(image.getWidth(), 
    image.getHeight(), BufferedImage.TYPE_INT_RGB);
convertedImage.createGraphics().drawRenderedImage(image, null);
ImageIO.write(convertedImage, "bmp", new File(outputFile));

通常のJAIと同じインデックスカラーモデルの問題が発生しているのではないかと思います。理想的には、ImageIOクラスを使用して、最も単純な場合を除くすべてのケースでImageReaderインスタンスとImageWriterインスタンスを取得し、それに応じて読み取りパラメーターと書き込みパラメーターを微調整できるようにする必要がありますが、ImageIO.read()と.write()を微調整してあなたが欲しいもの。

22
Jeff