web-dev-qa-db-fra.com

Impossible de lire et d'écrire un fichier image TIFF à l'aide de Java bibliothèque standard ImageIO

Je ne sais pas quoi faire avec les images TIFF, mais je ne peux ni lire ni écrire aucune d'entre elles à l'aide de la bibliothèque ImageIO standard droite Java Java. Des réflexions?

Merci.

22
Gle

Si vous n'aimez pas ou ne pouvez pas utiliser JAI pour une raison quelconque, j'ai écrit un plugin TIFF ImageReader pour ImageIO, disponible sur GitHub . Il est pur Java et ne nécessite aucune installation native, et est livré avec une licence open source très conviviale (BSD).

Il prend en charge toutes les options TIFF de base, ainsi que de nombreuses extensions standard. À partir de la version 3.1, le plugin TIFF prend également en charge l'é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);
14
haraldK

Selon JEP 262: TIFF Image I/O le plugin TIFF qui faisait partie de JAI sera disponible dans le cadre de Java SE, à partir de Java 9.

Cela signifie que, en utilisant Java 9 ou une version ultérieure, le code suivant fonctionnera, sans aucune importation ni dépendance supplémentaires:

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

Je n'ai pas encore pu vérifier la prise en charge des saveurs TIFF non basiques dans ce plugin, mais je suppose qu'au moins les TIFF basiques devraient être entièrement pris en charge.

5
haraldK

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

Où es-tu coincé? Les éléments suivants fonctionnent-ils 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);
        } 
    }
}
4
MPG