2009-12-23 53 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。