无法使用Java ImageIO标准库读取和写入TIFF图像文件

我不知道如何处理TIFF图像,但我无法使用直接的Java标准ImageIO库来读取或写入任何图像。 有什么想法吗?

谢谢。

如果您因为任何原因不喜欢或不能使用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); 

我试过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); } } } 

根据JEP 262:TIFF图像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); 

我还没有能够validation此插件中对非基线TIFF风格的支持,但我认为至少应该完全支持基线TIFF。

添加Maven依赖:

  org.geotoolkit geotk-coverageio 3.17  

代码示例:

 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