2009-12-23 181 views
20

我不知道如何处理TIFF图像,但是我无法使用直接的Java标准ImageIO库读取或写入它们中的任何一个。有什么想法吗?使用Java ImageIO标准库无法读取和写入TIFF图像文件

谢谢。

+0

您使用Java SE吗? [Java Advanced Imaging API](http://java.sun.com/products/java-media/jai/iio.html)支持TIFF。详情[这里](https://jai-imageio.dev.java.net/)。 – MPG 2009-12-23 19:14:29

+1

您需要[JAI包](https://jai.dev.java.net/#Downloads)来处理TIFF文件。一个显示TIFF文件的简单例子:[显示一个TIF](http://www.rgagnon.com/javadetails/java-0605.html) – RealHowTo 2009-12-23 21:26:37

回答

2

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

一旦你在classpath中有jai_imageio.jar,你应该简单的正常使用ImageIO API – MadProgrammer 2012-07-18 00:08:50

-3

添加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")); 
+0

恐怕依赖不再起作用。什么工作对我来说: \t com.github.jai-的ImageIO \t JAI-ImageIO的核心 \t 1.3.1 \t (我没有与整个代码尝试一下你的)。 – DarkPurpleShadow 2017-07-18 08:32:02

9

如果你不喜欢或者不能使用JAI为我写了一个TIFF插件的ImageReader任何理由ImageIO,请登录GitHub。它是纯Java的,不需要任何本机安装,并且带有非常友好的开源许可证(BSD)。

它支持任何基线TIFF选项以及大量的标准扩展。从版本3.1起,TIFF插件也具有写入支持。

在你的类路径正确的JAR文件,使用可以简单到:

BufferedImage image = ImageIO.read(inputTIFF); 
// ...modify image (compose, resize, sharpen, etc)... 
ImageIO.write(image, "TIFF", outputTIFF); 
+0

你好haraldK你怎么用这个?我根本不喜欢JAI,我找不到任何关于如何将tiff文件转换为jpg的例子。我试过了:BufferedImage image = ImageIO.read(new File(inFile)); !ImageIO。写(图像,“jpg”,新的文件(outFile))) – delkant 2014-04-07 23:20:02

+0

@delkant这可能应该工作,如果你有一切正确安装。请参阅[安装说明](https://github.com/haraldk/TwelveMonkeys#installing)以获取更多详细信息,或者如果无法使用它,请提交问题(包含完整详细信息)。 – haraldK 2014-04-08 10:16:23

2

根据JEP 262: TIFF Image I/O的TIFF插件,曾经是JAI的一部分将可作为Java SE的一部分,从Java 9.

这意味着,使用Java 9日起,下列代码将只是工作,没有任何额外的进口或依赖性:

BufferedImage image = ImageIO.read(inputTIFF); 
// ...modify image (compose, resize, sharpen, etc)... 
ImageIO.write(image, "TIFF", outputTIFF); 

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