web-dev-qa-db-fra.com

Comment convertir un fichier TIFF en JPEG/PNG en Java

récemment, je suis confronté à un problème lorsque j'essaie d'afficher un fichier image. Malheureusement, le format d'image est le format TIFF, qui n'est pas pris en charge par les principaux navigateurs Web (seul Safari prenant en charge ce format). En raison de certaines contraintes, je dois convertir ce format en un autre format pris en charge par le navigateur principal. Cependant, cela me pose beaucoup de problèmes lorsque j'essaie de convertir le format.

J'avais une recherche sur le Web et bien qu'il y ait eu un problème similaire posté dans ce lien Comment convertir un fichier TIF en fichier PNG en Java? "mais je ne peux pas avoir le résultat tel que proposé ...

Par conséquent, je soulève à nouveau cette question pour souhaiter que vous puissiez tous avoir une meilleure explication et des lignes directrices.

Il y avait peu de problèmes que je rencontrais au cours de la solution proposée:

1) Selon la réponse proposée par Jonathan Feinberg , il faut installer JAI et JAI/ImageIO. Cependant, après avoir installé les deux, je ne pouvais toujours pas importer le fichier dans Netbean 7.2. NetBean 7.2 reste proposé à l'importation par défaut de la bibliothèque imageIO.

2) lorsque j'utilise la méthode de lecture par défaut de la bibliothèque ImageIO, elle renvoie la valeur NULL et je ne peux plus continuer.

3) J'ai également essayé d'autres méthodes telles que convertir le fichier TIFF en fichier BIN en utilisant la méthode BufferedOutputStream mais le fichier de résultat est supérieur à 11 Mo, ce qui est trop volumineux pour être chargé et le chargement a échoué.

 if (this.selectedDO != null) {
        String tempDO = this.selectedDO.DONo;
        String inPath = "J:\\" + tempDO + ".TIF";
        String otPath = "J:\\" + tempDO + ".bin";

        File opFile = new File(otPath);

        File inFile = new File(inPath);

        BufferedInputStream input = null;
        BufferedOutputStream output = null;
        try {
            input = new BufferedInputStream(new FileInputStream(inPath), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(new FileOutputStream(otPath), DEFAULT_BUFFER_SIZE);

            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }

        } finally {
            try {
                output.flush();
                output.close();
                input.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

Par conséquent, espérons que vous pourrez obtenir de l'aide et des conseils de la part de tous afin que je puisse convertir le format TIFF en un autre format tel que JPEG/PNG.

11
jc88

Était passé au travers des études et des tests, avait trouvé une méthode pour convertir TIFF en JPEG et désolé pour l’attente si longtemps seulement avait téléchargé cette réponse.

        SeekableStream s = new FileSeekableStream(inFile);
        TIFFDecodeParam param = null;
        ImageDecoder dec = ImageCodec.createImageDecoder("tiff", s, param);
        RenderedImage op = dec.decodeAsRenderedImage(0);

        FileOutputStream fos = new FileOutputStream(otPath);
        JPEGEncodeParam jpgparam = new JPEGEncodeParam();
        jpgparam.setQuality(67);
        ImageEncoder en = ImageCodec.createImageEncoder("jpeg", fos, jpgparam);
        en.encode(op);
        fos.flush();
        fos.close();

p/s: otPath désigne le chemin dans lequel vous souhaitez stocker votre image JPEG. Par exemple: "C: /image/abc.JPG"; inFile est le fichier d'entrée qui est le fichier TIFF

Au moins cette méthode est réalisable pour moi. S'il y a une autre meilleure méthode, veuillez partager avec nous.

Merci et salutations,

14
jc88
  1. Ajouter une dépendance

     <dependency>
     <groupId>com.github.jai-imageio</groupId>
     <artifactId>jai-imageio-core</artifactId>
     <version>1.3.1</version> </dependency>
    

https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core

https://mvnrepository.com/artifact/com.github.jai-imageio/jai-imageio-core/1.3.1

  1. Codage

    final BufferedImage tif = ImageIO.read(new File("test.tif"));
    ImageIO.write(tif, "png", new File("test.png"));
    
7
Tk Yoon

Dans le cas de plusieurs pages, travail suivant:

  1. ajouter une dépendance:

    <dependency>
        <groupId>com.github.jai-imageio</groupId>
        <artifactId>jai-imageio-core</artifactId>
        <version>1.4.0</version>
    </dependency>
    
  2. utiliser le code Java8 suivant

    public void convertTiffToPng(File file) {
    try {
        try (InputStream is = new FileInputStream(file)) {
            try (ImageInputStream imageInputStream = ImageIO.createImageInputStream(is)) {
                Iterator<ImageReader> iterator = ImageIO.getImageReaders(imageInputStream);
                if (iterator == null || !iterator.hasNext()) {
                    throw new RuntimeException("Image file format not supported by ImageIO: " + file.getAbsolutePath());
                }
    
    
                // We are just looking for the first reader compatible:
                ImageReader reader = iterator.next();
                reader.setInput(imageInputStream);
    
                int numPage = reader.getNumImages(true);
    
                // it uses to put new png files, close to original example n0_.tiff will be in /png/n0_0.png
                String name = FilenameUtils.getBaseName(file.getAbsolutePath()); 
                String parentFolder = file.getParentFile().getAbsolutePath();
    
                IntStream.range(0, numPage).forEach(v -> {
                    try {
                        final BufferedImage tiff = reader.read(v);
                        ImageIO.write(tiff, "png", new File(parentFolder + "/png/" + name + v + ".png"));
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
            }
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    }
    
4
Alexey Alexeenka

Tout d’abord, jetez un coup d’œil à Quelle est la meilleure bibliothèque/approche de traitement d’images Java? . Pour votre code, vous pouvez utiliser

javax.imageio.ImageIO.write(im, type, represFile);

comme vous pouvez le voir dans écrivez une image dans un exemple de fichier .

0
user1929959

Vous pouvez essayer cette superbe bibliothèque Java sur Github qui fournit de nombreux utilitaires pour gérer, ouvrir et écrire des fichiers .tiff.

Un exemple simple de Git montre comment convertir un fichier TIFF en JPEG:

TiffConverter.ConverterOptions options = new TiffConverter.ConverterOptions();
//Set to true if you want use Java exception mechanism
options.throwExceptions = false; 
//Available 128Mb for work
options.availableMemory = 128 * 1024 * 1024; 
//Number of tiff directory to convert;
options.readTiffDirectory = 1;         
//Convert to JPEG
TiffConverter.convertTiffJpg("in.tif", "out.jpg", options, progressListener);
0
DarkCygnus