Я не знаю, что делать с изображениями TIFF, но я не могу читать или писать ни один из них, используя прямую стандартную библиотеку ImageIO Java. Любые мысли?
Спасибо.
Я не знаю, что делать с изображениями TIFF, но я не могу читать или писать ни один из них, используя прямую стандартную библиотеку ImageIO Java. Любые мысли?
Спасибо.
Если вы не любите или не можете использовать 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);
Я попробовал 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);
}
}
}
В соответствии с JEP 262: TIFF Image I/O плагин 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 должны быть полностью поддерживаемы.
Добавить зависимость от 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"));