次のコードを試して、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)
この問題をどのように解決できるか考えていますか?
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()を微調整してあなたが欲しいもの。