Не могу прочитать и записать файл изображения TIFF, используя стандартную библиотеку Java ImageIO - PullRequest
22 голосов
/ 23 декабря 2009

Я не знаю, что делать с изображениями в формате TIFF, но я не могу ни читать, ни писать ни одно из них, используя стандартную библиотеку JavaIO ImageIO. Есть мысли?

Спасибо.

Ответы [ 4 ]

13 голосов
/ 29 мая 2013

Если вам не нравится или не удается использовать 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);
5 голосов
/ 22 ноября 2016

Согласно JEP 262: ввод / вывод изображения TIFF плагин 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 должны поддерживаться полностью.

3 голосов
/ 24 декабря 2009

Я попробовал 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);
        } 
    }
}
0 голосов
/ 02 августа 2012

Добавить зависимость 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"));
...