我不知道如何处理TIFF图像,但我无法使用直接Java标准ImageIO库来读取或写入任何图像。有什么想法吗?
感谢。
答案 0 :(得分:13)
如果您因为任何原因不喜欢或不能使用JAI,我已为ImageIO编写了TIFF ImageReader插件,可在GitHub上找到。它是纯Java,不需要任何本机安装,并且具有非常友好的开源许可证(BSD)。
它支持任何基线TIFF选项,以及许多标准扩展。从版本3.1开始,TIFF插件也有写支持。
在类路径中使用正确的JAR,使用方法可以简单:
BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);
答案 1 :(得分:5)
根据JEP 262: TIFF Image I/O,以前作为JAI一部分的TIFF插件将作为Java SE的一部分提供,从Java 9开始。
这意味着,使用Java 9或更高版本,以下代码将正常工作,无需任何额外的导入或依赖:
BufferedImage image = ImageIO.read(inputTIFF);
// ...modify image (compose, resize, sharpen, etc)...
ImageIO.write(image, "TIFF", outputTIFF);
我还没有能够在此插件中验证对非基线TIFF风格的支持,但我认为至少应该完全支持基线TIFF。
答案 2 :(得分:3)
你被困在哪里?以下是否适用于您?我尝试了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);
}
}
}
答案 3 :(得分:0)
Java仅从Java 9版本开始支持TIFF格式。如果您尝试将ImageIO for TIFF使用到较旧的Java版本中,则会出现异常。
如果您还想在早期版本中使用TIFF,只需添加十二只猴子的依赖项,即可将十二只猴子插件与Java一起使用。
十二只猴子的Maven依赖关系:
<dependency>
<groupId>com.twelvemonkeys.imageio</groupId>
<artifactId>imageio-tiff</artifactId>
<version>3.5</version>
</dependency>*
我还给出了使用十二只猴子将多个图像合并为带有页面的单个TIFF的示例,
BufferedImage b1 = null;
BufferedImage b2 = null;
TIFFImageReaderSpi SPI = new TIFFImageReaderSpi();
ImageReader imageReader1 = SPI.createReaderInstance();
ImageInputStream iis1 = ImageIO.createImageInputStream(new File("1.tif"));
imageReader1.setInput(iis1);
b1 = imageReader1.read(0);
ImageReader imageReader2 = SPI.createReaderInstance();
ImageInputStream iis2 = ImageIO.createImageInputStream(new File("2.tif"));
imageReader2.setInput(iis2);
b2 = imageReader2.read(0);
ImageWriter writer = ImageIO.getImageWritersByFormatName("TIFF").next();
writer.setOutput(ImageIO.createImageOutputStream(new File("3.tif")));
ImageWriteParam writeParam = writer.getDefaultWriteParam();
//writeParam.setTilingMode(ImageWriteParam.MODE_EXPLICIT);
//writeParam.setCompressionType("Deflate");
writer.prepareWriteSequence(null);
IIOImage i1 = new IIOImage(b1, null, null);
IIOImage i2 = new IIOImage(b2, null, null);
writer.writeToSequence(i1, writeParam);
writer.writeToSequence(i2, writeParam);
writer.endWriteSequence();
writer.dispose();
上面的代码将与Java8一起使用,并编写为打开两个TIFF图像并合并为一个。
此外,您可以根据需要使用压缩。只需使用注释行添加压缩即可。
答案 4 :(得分:-3)
添加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"));