2009-12-23 14 views
20

Je ne sais pas quoi faire avec les images TIFF, mais je ne peux pas les lire ou les écrire en utilisant une bibliothèque ImageIO Java standard. Des pensées?Impossible de lire et d'écrire un fichier image TIFF en utilisant la bibliothèque standard Java ImageIO

Merci.

+0

Utilisez-vous Java SE? L'API [Java Advanced Imaging API] (http://java.sun.com/products/java-media/jai/iio.html) prend en charge TIFF. Détails [ici] (https://jai-imageio.dev.java.net/). – MPG

+1

Vous avez besoin du [package JAI] (https://jai.dev.java.net/#Downloads) pour gérer les fichiers TIFF. Un exemple simple pour afficher un fichier TIFF: [Afficher un TIF] (http://www.rgagnon.com/javadetails/java-0605.html) – RealHowTo

Répondre

2

J'ai essayé JAI, et cela n'a pas fonctionné pour moi.

Où êtes-vous bloqués? Est-ce que ce qui suit fonctionne pour vous?

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

Une fois que vous avez jai_imageio.jar dans votre classpath, vous devriez simplement pouvoir pour utiliser l'API ImageIO comme d'habitude – MadProgrammer

-3

Ajouter la dépendance Maven:

<dependency> 
    <groupId>org.geotoolkit</groupId> 
    <artifactId>geotk-coverageio</artifactId> 
    <version>3.17</version> 
</dependency> 

Exemple de code:

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

J'ai peur que la dépendance ne fonctionne plus. Ce qui a fonctionné pour moi: \t com.github.jai-ImageIO \t -ImageIO-jai noyau \t 1.3.1 \t (je n'y suis pas allé avec tout le code de la vôtre). – DarkPurpleShadow

9

Si vous ne souhaitez pas ou ne pouvez pas utiliser JAI pour quelque raison que je l'ai écrit un plugin ImageReader TIFF pour ImageIO, disponible sur GitHub. Il s'agit d'un langage Java pur qui ne nécessite aucune installation native et qui est livré avec une licence Open Source très conviviale (BSD).

Il prend en charge toute option TIFF de base, avec beaucoup d'extensions standard. A partir de la version 3.1, le plugin TIFF a aussi un support en écriture.

Avec les fichiers JAR appropriés dans votre chemin de classe, l'utilisation peut être aussi simple que:

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

HI haraldK comment l'utilisez-vous ??? Je n'aime pas JAI du tout, je ne pouvais trouver aucun exemple sur la façon de convertir un fichier tiff en jpg. J'ai essayé: BufferedImage image = ImageIO.read (nouveau fichier (inFile)); ! ImageIO.write (image, "jpg", nouveau fichier (outFile))) – delkant

+0

@delkant Cela pourrait fonctionner, si tout est correctement installé. Reportez-vous aux [instructions d'installation] (https://github.com/haraldk/TwelveMonkeys#installing) pour plus de détails, ou déposez un problème (avec tous les détails) si vous ne pouvez pas le faire fonctionner. – haraldK

2

Selon JEP 262: TIFF Image I/O le plugin TIFF utilisé pour faire partie de l'IMA sera disponible dans le cadre de Java SE, à partir de Java 9.

Cela signifie, en utilisant Java 9, le code suivant fonctionne tout simplement, sans les importations supplémentaires ou des dépendances:

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

Je n'ai pas encore été en mesure de vérifier la prise en charge des variantes TIFF autres que de base dans ce plugin, mais je suppose qu'au moins les fichiers TIFF de base doivent être entièrement pris en charge.