TIFF 画像をどうすればよいかわかりませんが、そのままの Java 標準 ImageIO ライブラリを使用してそれらを読み書きすることはできません。何かご意見は?
ありがとう。
TIFF 画像をどうすればよいかわかりませんが、そのままの Java 標準 ImageIO ライブラリを使用してそれらを読み書きすることはできません。何かご意見は?
ありがとう。
何らかの理由で JAI が気に入らない、または使用できない場合は、GitHubで入手できる ImageIO 用の TIFF ImageReader プラグインを作成しました。これは純粋な Java であり、ネイティブ インストールを必要とせず、非常に使いやすいオープン ソース ライセンス (BSD) が付属しています。
多くの標準拡張とともに、あらゆるベースライン TIFF オプションをサポートします。バージョン 3.1 から、TIFF プラグインは書き込みサポートも備えています。
クラスパスに適切な JAR を使用すると、次のように簡単に使用できます。
BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);
JEP 262: TIFF Image I/O によると、JAI の一部であった TIFF プラグインは、Java 9 以降、Java SE の一部として利用できるようになります。
つまり、Java 9 以降を使用すると、追加のインポートや依存関係がなくても、次のコードが機能します。
BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);
このプラグインでの非ベースライン TIFF フレーバーのサポートはまだ確認できていませんが、少なくともベースライン TIFF は完全にサポートされているはずです。
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);
}
}
}
Java は、Java 9 リリースからのみ TIFF 形式をサポートします。TIFF 用の ImageIO を古い Java バージョンで使用しようとすると、例外が発生します。
以前のバージョンでも TIFF を使用する場合は、Twelve Monkey の依存関係を追加するだけで、Java と共に Twelve Monkey プラグインを使用できます。
Twelve Monkey の Maven 依存関係:
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-tiff</artifactId>
<version>3.5</version>
</dependency>*
また、複数の画像を Twelve Monkey を使用したページで単一の TIFF にマージする例も示しています。
BufferedImage b1 = null;
BufferedImage b2 = null;
TIFFImageReaderSpi SPI = new TIFFImageReaderSpi();
ImageReader imageReader1 = SPI.createReaderInstance();
ImageInputStream iis1 = ImageIO.createImageInputStream(new File("1.tif"));
imageReader1.setInput(iis1);
b1 = imageReader1.read(0);
ImageReader imageReader2 = SPI.createReaderInstance();
ImageInputStream iis2 = ImageIO.createImageInputStream(new File("2.tif"));
imageReader2.setInput(iis2);
b2 = imageReader2.read(0);
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next();
writer.setOutput(ImageIO.createImageOutputStream(new File("3.tif")));
ImageWriteParam writeParam = writer.getDefaultWriteParam();
//writeParam.setTilingMode(ImageWriteParam.MODE_EXPLICIT);
//writeParam.setCompressionType("Deflate");
writer.prepareWriteSequence(null);
IIOImage i1 = new IIOImage(b1, null, null);
IIOImage i2 = new IIOImage(b2, null, null);
writer.writeToSequence(i1, writeParam);
writer.writeToSequence(i2, writeParam);
writer.endWriteSequence();
writer.dispose();
上記のコードは Java8 で動作し、2 つの TIFF 画像を開いて 1 つに結合するように記述されています。
また、必要に応じて圧縮を使用することもできます。コメント行を使用して圧縮を追加するだけです。
Maven依存関係を追加します:
<dependency>
<groupId>org.geotoolkit</groupId>
<artifactId>geotk-coverageio</artifactId>
<version>3.17</version>
</dependency>
コード例:
import org.geotoolkit.image.io.plugin.RawTiffImageReader;
IIORegistry registry = IIORegistry.getDefaultInstance();
registry.registerServiceProvider(new RawTiffImageReader.Spi());
String[] a = ImageIO.getReaderFileSuffixes();
for (int i=0; i<a.length; i++) {
System.out.println(a[i]);
}
BufferedImage image = ImageIO.read(new File("C:\\mypic.tiff"));
ImageIO.write(image, "jpg",new File("C:\\out.jpg"));
ImageIO.write(image, "gif",new File("C:\\out.gif"));
ImageIO.write(image, "png",new File("C:\\out.png"));
ImageIO.write(image, "tif",new File("C:\\out.tiff"));