25

TIFF 画像をどうすればよいかわかりませんが、そのままの Java 標準 ImageIO ライブラリを使用してそれらを読み書きすることはできません。何かご意見は?

ありがとう。

4

5 に答える 5

20

何らかの理由で 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);
于 2013-05-29T12:46:50.937 に答える
9

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 は完全にサポートされているはずです。

于 2016-11-22T11:48:42.603 に答える
4

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);
        } 
    }
}
于 2009-12-24T16:05:20.723 に答える
0

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 つに結合するように記述されています。

また、必要に応じて圧縮を使用することもできます。コメント行を使用して圧縮を追加するだけです。

于 2020-06-01T12:47:40.047 に答える
-4

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"));
于 2012-08-01T21:28:12.503 に答える