java tiff javax.imageio

No se puede leer y escribir un archivo de imagen TIFF usando la biblioteca estándar Java ImageIO



javax.imageio (4)

No sé qué hacer con las imágenes TIFF, pero no puedo leer ni escribir ninguna de ellas utilizando la biblioteca ImageIO estándar de Java. ¿Alguna idea?

Gracias.


Intenté JAI, y no funcionó para mí.

¿Dónde estás atrapado? ¿Funciona lo siguiente para usted?

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); } } }


Añadir dependencia de Maven:

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

Ejemplo de código:

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"));


De acuerdo con JEP 262: TIFF Image I / O, el plugin TIFF que solía ser parte de JAI estará disponible como parte de Java SE, comenzando desde Java 9.

Eso significa que, usando Java 9, el siguiente código simplemente funcionará, sin importaciones ni dependencias adicionales:

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

Todavía no he podido verificar el soporte para los sabores TIFF que no están en la línea de base en este complemento, pero supongo que al menos los TIFF de línea de base deberían ser totalmente compatibles.


Si no le gusta o no puede usar JAI por algún motivo, he escrito un complemento TIFF ImageReader para ImageIO, disponible en GitHub . Es puramente Java y no necesita ninguna instalación nativa, y viene con una licencia de código abierto (BSD) muy amigable.

Admite cualquier opción TIFF de referencia, junto con muchas extensiones estándar. Desde la versión 3.1, el complemento TIFF también tiene soporte de escritura.

Con los JAR correctos en su ruta de clase, el uso puede ser tan simple como:

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